我有两个问题:
在第一部分中:我想比较两个文件中的第二列。如果匹配,则在输出文件中打印相应的值。
在第二部分:我还需要相反的信息。同样,我想比较来自相同两个文件的第二列。如果存在唯一的字符串值(意味着某些内容出现在文件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的所有唯一行。
答案 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