1

我有一个两部分的awk问题:

在第一部分:我想比较两个文件的第二列。如果匹配,则在输出文件中打印相应的值。

在第二部分:我也需要相反的信息。同样,我想比较来自相同两个文件的第二列。如果有一个唯一的字符串值(意味着出现在文件 1 的第 2 列中而不是出现在文件 2 的第 2 列中的内容)。

解决第一部分:我使用了以下awk

awk 'NR==FNR { a[$1]=$2; next} $1 in a {print $0, a[$1]}' File2 File1

这里找到,这似乎解决了识别匹配值的问题。

但是,我似乎找不到从文件 1 中识别唯一信息并将其打印到第三个输出文件中的解决方案。谁能提供有关如何解决此问题的任何见解?

输入示例如下:

文件 1

A   concept1    123
A   concept2    123
A   concept1    123
A   concept1    123
A   concept3    123

文件 2

B   concept1    456
B   concept4    456
B   concept5    456
B   concept1    456
B   concept3    456

输出文件 3

concept4
concept5

谢谢你。

更新:在原始文件中,我提出了将 1 个文件与另一个文件进行比较的问题。是否可以修改此代码以将 1 个文件与多个其他文件进行比较?

例如:

输入:将 FILE1 与 FILE2、FILE3、FILE4...FILEn 进行比较的任何唯一行 输出:文件与来自 FILE1 的所有唯一行。

4

2 回答 2

1

IIUC,您以错误的方式处理它。您正在$1用作数组的索引,这对于每条记录都是相同的。

小输入文件

解决问题的一种方法是将第二列保存到第二a个文件中并对其进行检查。像这样的东西:

awk 'NR==FNR { a[FNR]=$2; next} $2 != a[FNR] { print $2 }' File1 File2

输出:

concept4
concept5

大型输入文件

如果输入文件非常大,上述方法将使用大量内存。在这种情况下,更好的方法是像这样预处理输入:

paste <( <File1 tr -s ' ' | cut -d' ' -f2) \
      <( <File2 tr -s ' ' | cut -d' ' -f2) | 
  awk '$1 != $2 { print $2 }'

输出:

concept4
concept5
于 2013-10-11T14:25:16.983 回答
1

鉴于您发布的示例输入文件:

$ awk 'NR==FNR{seen[$2]++;next} seen[$2]{print $2}' file1 file2
concept1
concept1
concept3

$ awk 'NR==FNR{seen[$2]++;next} !seen[$2]{print $2}' file1 file2
concept4
concept5

$ awk 'NR==FNR{seen[$2]++;next} !seen[$2]{print $2}' file2 file1
concept2
于 2013-10-11T18:19:39.533 回答