用每一行的用户输入替换文件中的某些字段并保存在同一个文件中
Replace certain field from file with user input for each row and save in same file
我正在打字以编写一个可以读取 file_name、delimiter 和 [=38 的脚本=]。之后对每一行进行输入,替换字段(由 field_number 指定)并输出到同一文件。
例如输入如下:
Ritesh;M;1992
Shakya;F;1993
对于命令
bash_script.sh test.csv ";" 3
如果我第一行输入 1994,第二行输入 1995,则遍历每一行。我希望在同一个文件中的输出如下所示。
Ritesh;M;1994
Shakya;F;1995
到目前为止,我设法做到了这一点:
#!/usr/bin/env bash
echo "Following is the input needed:";
echo "$1: FILE_NAME";
echo "$2: DELIMITER";
echo "$3: FIELD IN NUMERIC VALUE";
gawk -i inplace -F "" '{...}' ;
我的 gawk
版本也不支持 -i。
提前致谢。
我始终选择退出使用 sed;
#!/bin/bash
FILE=
DELIM=
FIELD=
REPLACEMENT="XXX"
sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD" $FILE
如果需要是根据当前值计算出来的东西,需要循环每一行提取出来。
#!/bin/bash
FILE=
DELIM=
FIELD=
while read line; do
value="$(echo $line | cut -d"$DELIM" -f$FIELD)"
if [ "$value" == "1992" ]; then REPLACEMENT="1994";
elif [ "$value" == "1993" ]; then REPLACEMENT="1995";
fi
echo $line | sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD"
done < $FILE
第一个问题的答案
如果只需要将1992
替换为1994
,将1993
替换为1995
,则不需要脚本,使用sed即可轻松完成:
sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
输出:
[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
如果你还需要保存输出你可以添加
sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g" > temp; mv temp test.scv
但是如果你想使用脚本:
#!/bin/bash
if [ -z "" ];then
echo "Usage: [=13=] <filename>"
else
FILENAME=
sed "s/;1992/;1994/g" $FILENAME| sed "s/;1993/;1995/g"
fi
输出:
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
脚本在上次评论后更新
#!/bin/bash
if [ -z "" ];then
echo "Usage: <filename> <delimiter> <field_no>"
else
FILENAME=$(readlink -f )
DELIMITER=
FIELD_NO=
TEMP_FILE=/tmp/tempFile
if [ -f $TEMP_FILE ]; then
rm $TEMP_FILE
fi
for line in $(cat $FILENAME)
do
oldValue=`echo $line|cut -d$DELIMITER -f$FIELD_NO`
echo "Enter the value to replace [$oldValue]"
read newValue
echo $line | sed "s/${oldValue}/${newValue}/g" >> $TEMP_FILE
done
fi
mv $TEMP_FILE $FILENAME
我对命令 #mv tempFile $FILENAME
进行了注释,因为您可以选择重命名文件或保留新文件。
我正在打字以编写一个可以读取 file_name、delimiter 和 [=38 的脚本=]。之后对每一行进行输入,替换字段(由 field_number 指定)并输出到同一文件。
例如输入如下:
Ritesh;M;1992 Shakya;F;1993
对于命令
bash_script.sh test.csv ";" 3
如果我第一行输入 1994,第二行输入 1995,则遍历每一行。我希望在同一个文件中的输出如下所示。
Ritesh;M;1994 Shakya;F;1995
到目前为止,我设法做到了这一点:
#!/usr/bin/env bash
echo "Following is the input needed:";
echo "$1: FILE_NAME";
echo "$2: DELIMITER";
echo "$3: FIELD IN NUMERIC VALUE";
gawk -i inplace -F "" '{...}' ;
我的 gawk
版本也不支持 -i。
提前致谢。
我始终选择退出使用 sed;
#!/bin/bash
FILE=
DELIM=
FIELD=
REPLACEMENT="XXX"
sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD" $FILE
如果需要是根据当前值计算出来的东西,需要循环每一行提取出来。
#!/bin/bash
FILE=
DELIM=
FIELD=
while read line; do
value="$(echo $line | cut -d"$DELIM" -f$FIELD)"
if [ "$value" == "1992" ]; then REPLACEMENT="1994";
elif [ "$value" == "1993" ]; then REPLACEMENT="1995";
fi
echo $line | sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD"
done < $FILE
第一个问题的答案
如果只需要将1992
替换为1994
,将1993
替换为1995
,则不需要脚本,使用sed即可轻松完成:
sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
输出:
[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
如果你还需要保存输出你可以添加
sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g" > temp; mv temp test.scv
但是如果你想使用脚本:
#!/bin/bash
if [ -z "" ];then
echo "Usage: [=13=] <filename>"
else
FILENAME=
sed "s/;1992/;1994/g" $FILENAME| sed "s/;1993/;1995/g"
fi
输出:
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
脚本在上次评论后更新
#!/bin/bash
if [ -z "" ];then
echo "Usage: <filename> <delimiter> <field_no>"
else
FILENAME=$(readlink -f )
DELIMITER=
FIELD_NO=
TEMP_FILE=/tmp/tempFile
if [ -f $TEMP_FILE ]; then
rm $TEMP_FILE
fi
for line in $(cat $FILENAME)
do
oldValue=`echo $line|cut -d$DELIMITER -f$FIELD_NO`
echo "Enter the value to replace [$oldValue]"
read newValue
echo $line | sed "s/${oldValue}/${newValue}/g" >> $TEMP_FILE
done
fi
mv $TEMP_FILE $FILENAME
我对命令 #mv tempFile $FILENAME
进行了注释,因为您可以选择重命名文件或保留新文件。