awk在多个文件中的特定列中标识唯一信息

时间:2013-10-11 07:36:47

标签: awk unique match

我有两个问题:

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

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

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

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

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

但是,我似乎找不到从文件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 OUTPUT的任何唯一行进行比较:FILE包含来自FILE1的所有唯一行。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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