Shell 用序列号替换字段值

Shell 用序列号替换字段值,shell,unix,Shell,Unix,我有这样的场景 cat file2 aa~bb~20~dd xx~yy~21~kk cc~ff~22~pp ....... 文件1具有 cat file1 aa~bb~1~dd xx~yy~2~kk cc~ff~3~pp ....... 我想像这样更新文件 cat file2 aa~bb~20~dd xx~yy~21~kk cc~ff~22~pp ....... 尝试使用以下代码,但不起作用 seq_nr=20 i=1 while [i -le 10 ] do seq_nr=`expr 2

我有这样的场景

cat file2
aa~bb~20~dd
xx~yy~21~kk
cc~ff~22~pp
.......
文件1具有

cat file1
aa~bb~1~dd
xx~yy~2~kk
cc~ff~3~pp
.......
我想像这样更新文件

cat file2
aa~bb~20~dd
xx~yy~21~kk
cc~ff~22~pp
.......
尝试使用以下代码,但不起作用

seq_nr=20
i=1
while [i -le 10 ]
do
seq_nr=`expr 20 + 1`
awk 'BEGIN {FS=OFS="~"} NR==i {$3=$seq_nr} {print} file1 > file2
i= `expr i +1`
done

您可以使用此awk单衬套:

awk 'BEGIN{FS=OFS="~"} {$3+=19}1' file1 > file2

cat file2
aa:bb:20:dd
xx:yy:21:kk
cc:ff:22:pp
awk -F~ -v OFS='~' '$3=19+NR' file
或纯BASH代码:

IFS='~' && while read v1 v2 v3 v4; do
   echo "$v1:$v2:$((v3+19)):$v4"
done < file
试试这一行:

awk 'BEGIN{FS=OFS="~"} {$3+=19}1' file1 > file2

cat file2
aa:bb:20:dd
xx:yy:21:kk
cc:ff:22:pp
awk -F~ -v OFS='~' '$3=19+NR' file
以你的例子:

kent$  echo "aa~bb~1~dd
xx~yy~2~kk
cc~ff~3~pp"| awk -F~ -v OFS='~' '$3=19+NR'
aa~bb~20~dd
xx~yy~21~kk
cc~ff~22~pp

seq_nr不是常数,文件大约有31个字段。输入文件可以有我建议的使用awk命令的任何文件。如果假设我有3条记录,它是aa~bb~21~dd xx~yy~2~kk cc~ff~3~pp aa~bb~1~dd xx~yy~22~kk cc~ff~3~pp