如果两列匹配,则更改第三列

时间:2018-09-04 11:00:01

标签: awk sed

文件1.txt

13002:1:3:6aw:4:g:Dw:S:5342:dsan
13003:5:3s:6s:4:g:D:S:3456:fdsa
13004:16:t3:6:4hh:g:D:S:5342:inef

文件2.txt

13002:6544
13003:5684

我需要用1.txt的第2列中的新数据替换2.txt的第9列中的旧数据。我认为这可以逐行完成,因为两个文件具有相同的列1字段。这是3Gb的文件大小。我一直在玩awk,但无法实现以下目标。

我正在尝试以下操作:

awk 'NR==FNR{a[$1]=$2;} {$9a[b[2]]}' 1.txt 2.txt

预期结果:

13002:1:3:6aw:4:g:Dw:S:6544:dsan
13003:5:3s:6s:4:g:D:S:5684:fdsa  
13004:16:t3:6:4hh:g:D:S:5342:inef 

1 个答案:

答案 0 :(得分:3)

您似乎尝试了几种错别字。您想用数组中的值替换$ 9(如果已定义)。另外,您还要确保Awk在输入和输出上都使用冒号作为分隔符。

awk -F : 'BEGIN { OFS=FS }
    NR==FNR{a[$1]=$2; next}
    $1 in a {$9 = a[$1] } 1' 2.txt 1.txt

请注意2.txt的开头如何,因此NR==FNR在读取此文件时为true,但在开始读取1.txt时为true。第一个块中的next阻止Awk在读取第一个文件时执行第二个条件。最后的1是无条件print的简写,当然,无论是否替换了任何内容,第二个文件中的每一行都将执行它。