Linux 将文件中的某些字段替换为每行的用户输入,并保存在同一文件中
我正在输入一个脚本,可以读取文件名、分隔符和字段号。之后,为每一行获取一个输入,替换字段(由字段\u编号指定)并输出到同一文件 Ritesh;M;1994 Shakya;F;1995 例如,如果输入如下所示: Ritesh;M;1992 Shakya;F;1993 如果第一行输入1994,第二行输入1995,则迭代每一行。我希望输出是相同文件中的如下内容 Ritesh;M;1994 Shakya;F;1995 另外,我的Linux 将文件中的某些字段替换为每行的用户输入,并保存在同一文件中,linux,bash,awk,sh,gawk,Linux,Bash,Awk,Sh,Gawk,我正在输入一个脚本,可以读取文件名、分隔符和字段号。之后,为每一行获取一个输入,替换字段(由字段\u编号指定)并输出到同一文件 Ritesh;M;1994 Shakya;F;1995 例如,如果输入如下所示: Ritesh;M;1992 Shakya;F;1993 如果第一行输入1994,第二行输入1995,则迭代每一行。我希望输出是相同文件中的如下内容 Ritesh;M;1994 Shakya;F;1995 另外,我的gawk版本不支持-i。 提前感谢。使用sed始终是我的选择 #!/bin/
gawk
版本不支持-i。
提前感谢。使用sed始终是我的选择
#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3
REPLACEMENT="XXX"
sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD" $FILE
如果需要从当前值计算出某个值,则需要循环每一行并提取它
#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3
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
#/bin/bash
文件=$1
德利姆=2美元
字段=$3
读行时;做
value=“$(echo$行| cut-d“$DELIM”-f$字段)
如果[“$value”==“1992”];然后替换=“1994”;
elif[“$value”==“1993”];然后替换=“1995”;
fi
echo$line | sed“s/[^$DELIM]*/$REPLACEMENT/$FIELD”
完成<$FILE
使用sed始终是我的选择
#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3
REPLACEMENT="XXX"
sed "s/[^$DELIM]*/$REPLACEMENT/$FIELD" $FILE
如果需要从当前值计算出某个值,则需要循环每一行并提取它
#!/bin/bash
FILE=$1
DELIM=$2
FIELD=$3
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
#/bin/bash
文件=$1
德利姆=2美元
字段=$3
读行时;做
value=“$(echo$行| cut-d“$DELIM”-f$字段)
如果[“$value”==“1992”];然后替换=“1994”;
elif[“$value”==“1993”];然后替换=“1995”;
fi
echo$line | sed“s/[^$DELIM]*/$REPLACEMENT/$FIELD”
完成<$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
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
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 "${1}" ];then
echo "Usage: $0 <filename>"
else
FILENAME=$1
sed "s/;1992/;1994/g" $FILENAME| sed "s/;1993/;1995/g"
fi
#/bin/bash
如果[-z“${1}”];然后
echo“用法:$0”
其他的
文件名=$1
sed“s/;1992/;1994/g”$FILENAME | sed“s/;1993/;1995/g”
fi
输出:
[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
[shell]➤ ./test3.sh
用法:./test3.sh
[壳牌]➤ ./test3.sh test.csv
礼节;M1994
动摇;F1995
上次评论后更新的脚本
#!/bin/bash
if [ -z "${3}" ];then
echo "Usage: <filename> <delimiter> <field_no>"
else
FILENAME=$(readlink -f $1)
DELIMITER=$2
FIELD_NO=$3
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
#/bin/bash
如果[-z“${3}”];然后
回显“用法:”
其他的
文件名=$(readlink-f$1)
分隔符=$2
字段号=$3
临时文件=/tmp/tempFile
如果[-f$TEMP_文件];然后
rm$TEMP_文件
fi
对于$中的行(cat$文件名)
做
oldValue=`echo$line | cut-d$DELIMITER-f$FIELD|NO`
echo“输入要替换的值[$oldValue]”
读取新值
echo$line | sed“s/${oldValue}/${newValue}/g”>>$TEMP_文件
完成
fi
mv$TEMP_文件$FILENAME
我对命令
#mv tempFile$FILENAME
进行了注释,因为您可以选择重命名文件或保留新文件。回答第一个问题
如果您只需要将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
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
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 "${1}" ];then
echo "Usage: $0 <filename>"
else
FILENAME=$1
sed "s/;1992/;1994/g" $FILENAME| sed "s/;1993/;1995/g"
fi
#/bin/bash
如果[-z“${1}”];然后
echo“用法:$0”
其他的
文件名=$1
sed“s/;1992/;1994/g”$FILENAME | sed“s/;1993/;1995/g”
fi
输出:
[shell] ➤ sed "s/;1992/;1994/g" test.csv | sed "s/;1993/;1995/g"
Ritesh;M;1994
Shakya;F;1995
[shell] ➤ ./test3.sh
Usage: ./test3.sh <filename>
[shell] ➤ ./test3.sh test.csv
Ritesh;M;1994
Shakya;F;1995
[shell]➤ ./test3.sh
用法:./test3.sh
[壳牌]➤ ./test3.sh test.csv
礼节;M1994
动摇;F1995
上次评论后更新的脚本
#!/bin/bash
if [ -z "${3}" ];then
echo "Usage: <filename> <delimiter> <field_no>"
else
FILENAME=$(readlink -f $1)
DELIMITER=$2
FIELD_NO=$3
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
#/bin/bash
如果[-z“${3}”];然后
回显“用法:”
其他的
文件名=$(readlink-f$1)
分隔符=$2
字段号=$3
临时文件=/tmp/tempFile
如果[-f$TEMP_文件];然后
rm$TEMP_文件
fi
对于$中的行(cat$文件名)
做
oldValue=`echo$line | cut-d$DELIMITER-f$FIELD|NO`
echo“输入要替换的值[$oldValue]”
读取新值
echo$line | sed“s/${oldValue}/${newValue}/g”>>$TEMP_文件
完成
fi
mv$TEMP_文件$FILENAME
我已经对命令
#mv tempFile$FILENAME
进行了注释,因为您可以选择重命名该文件或保留新文件。如果您的gawk不支持-I,为什么您的示例中会出现该命令?您的脚本输入是test.csv
v
和3
,然后您将在1994
中转换1992
,在1995中转换1993
。是吗?@123我只需要写一个tmp文件,然后把它安装到适当的位置,或者其他类似的方法,所以这不是主要的问题。我刚才提到过。@claudiom输入是test.csv,分隔符";, 字段到modity 3。其余的正如你所说的。@riteshakya037这是替换逻辑1994
用于M
和1995
用于F
?如果您的gawk不支持-i,为什么会出现在您目前拥有的示例中?您的脚本输入是test.csv
v
和3
,然后您将在1994
中转换1992
,在1995中转换1993
。是吗?@123我只需要写一个tmp文件,然后把它安装到适当的位置,或者其他类似的方法,所以这不是主要的问题。我刚才提到过。@claudiom输入是test.csv,分隔符";, 字段到modity 3。其余的正如你所说的。@riteshakya037这是替换逻辑1994
对于M
和1995
对于F
?实际上,我想替换该列,无论其值是多少。对于每一行,提示输入一个值。实际上,我想替换该列,不管该列的值是多少。对于每一行,提示输入一个值。实际上,我想替换该列,不管该列的值是多少。对于每一行,