【问题标题】:Matching data in separate files匹配不同文件中的数据
【发布时间】:2013-12-14 13:25:35
【问题描述】:

我似乎遇到了几个此类问题,并且确实尝试过自己解决这个问题,但没有成功。

我有两个数据文件;我想比较他们的第一个字段并在输出文件中第一个文件的匹配条目旁边打印第二个文件中的行。维护文件 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

任何帮助将不胜感激。

【问题讨论】:

  • 输出中的42385 行,为什么第二列是空的?
  • @Kent。错字已修复。如有任何混淆,我们深表歉意。
  • 这个号码69245去哪儿了?它应该在您的输出示例中吗?
  • @Jotne。是的,它应该在输出中。固定的。谢谢。

标签: awk


【解决方案1】:

你很接近,这个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

【讨论】:

    【解决方案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 的建议,谢谢。

    【讨论】:

    • 您好也希望打印所有不匹配的行。 Se OP 请求输出。
    • 不必抱歉 :)
    • OP说需要维护文件1的顺序。
    • 您应该删除添加的号码。也许对于这个awk,一个命令会更好..
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多