![通过引用另一个文件来更新行](https://linux22.com/image/153614/%E9%80%9A%E8%BF%87%E5%BC%95%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E6%9D%A5%E6%9B%B4%E6%96%B0%E8%A1%8C.png)
我有两个逗号分隔的文件,如下所述,
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
怎么运行的:
-F, -v OFS=,
这将输入和输出字段分隔符设置为逗号。
FNR==NR{a[$1]=$2; next}
读取第一个文件 时,
source.txt
将第二个字段 的值保存在第一个字段 的键下的$2
关联数组中。然后跳过其余命令并跳转到重新开始就行了。a
$1
next
NF==1{$2=a[$1]}
如果当前行只有一个字段,则将第二个字段分配给关联数组 中的值
a
。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