我似乎有几个这类问题,并且真的试图在我自己的基础上解决这个问题而没有成功。
我有两个数据文件;我想比较它们的第一个字段,并从输出文件中第一个文件的匹配条目旁边的第二个文件中打印该行。保持文件1中的列表顺序很重要,包括没有匹配的行。这些文件是制表符分隔的值,但我可以根据需要更改它们(尽管数据中使用了逗号)。
FILE1.TXT
37600
39219
32887
01262
69241
00361
34180
42385
69245
FILE2.TXT
37600 GEAR PUMP 1
32887 MOTOR, 480V 1
34180 BRACKET 2
00361 WASHER 4
42385 SCREW 8
所需的输出文件
37600 GEAR PUMP 1
39219
32887 MOTOR, 480V 1
01262
69241
00361 WASHER 4
34180 BRACKET 2
42385 SCREW 8
69245
这是我迄今为止的最大努力,但它会导致一个空文件。
awk NR==NFR{a[$1];next}$1 in a {print $0} file1.txt file2.txt > outfile.txt
非常感谢任何帮助。
答案 0 :(得分:3)
你很接近,awk
应该这样做。
awk 'FNR==NR {a[$1]=$0;next} a[$0] {$0=a[$0]}1' file2 file1
37600 GEAR PUMP 1
39219
32887 MOTOR, 480V 1
01262
69241
00361 WASHER 4
34180 BRACKET 2
42385 SCREW 8
69245
我将file2
存储在数组中,$1
作为索引
如果在数组中找到file1
中的值,请将其设置为$0
并全部打印出来。
您也可以写这个,以标记应该比较的列#1
:
awk 'FNR==NR {a[$1]=$0;next} a[$1] {$0=a[$1]}1' file2 file1
答案 1 :(得分:2)
使用join:
join -1 2 -2 1 -a1 <(cat -n file1.txt | sort -k2,2) <(sort file2.txt) | sort -k2 | cut --complement -d" " -f2
37600 GEAR PUMP 1
39219
32887 MOTOR, 480V 1
01262
69241
00361 WASHER 4
34180 BRACKET 2
42385 SCREW 8
69245
根据@ devnul的建议,谢谢。