通过引用另一个文件来更新行

通过引用另一个文件来更新行

我有两个逗号分隔的文件,如下所述,

cat source.txt
A,1000
B,3000
C,2500
D,5000
E,4000
F,3000

cat test.txt
A,1000
C
D,5000
B
E

如何通过引用文件 source.txt 来更新文件 test.txt,以便预期输出如下,

cat test.txt
A,1000
C,2500
D,5000
B,3000
E,4000

答案1

尝试:

$ awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt 
A,1000
C,2500
D,5000
B,3000
E,4000

怎么运行的:

  1. -F, -v OFS=,

    这将输入和输出字段分隔符设置为逗号。

  2. FNR==NR{a[$1]=$2; next}

    读取第一个文件 时,source.txt将第二个字段 的值保存在第一个字段 的键下的$2关联数组中。然后跳过其余命令并跳转到重新开始就行了。a$1next

  3. NF==1{$2=a[$1]}

    如果当前行只有一个字段,则将第二个字段分配给关联数组 中的值a

  4. 1

    这是简写打印该行

对文件进行永久更改

对于任何版本的 awk,我们都可以使用以下命令对文件进行永久更新test.txt(推荐):

awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt >temp && mv temp test.txt

或者,如果有最新版本的 GNU awk(有时称为gawk):

awk -i inplace -F, -v OFS=, 'FNR==NR{a[$1]=$2; print; next} NF==1{$2=a[$1]} 1' source.txt test.txt

答案2

我已经按照下面的方法完成了并且效果很好

命令:

for i in `awk -F "," '{print $1}' file2`; do k=`awk -F "," -v i="$i" '$1 == i {print $2}' file1`; echo $i;echo $k;done| sed "N;s/\n/,/g"

输出

A,1000
C,2500
D,5000
B,3000
E,4000

相关内容