我有一个包含两列的文本文件,我只想打印两列中都存在的字符串。例如:
column1 column2
stringA stringZ
stringP stringT
stringZ stringX
stringE stringR
stringT stringG
预期输出:
stringZ
stringT
答案1
无耻地从 @cherdt 窃取并进行了一些改进(假设有类似 shellzsh
或bash
支持ksh
类似进程替换):
f=filename; comm -12 <(cut -f1 < "$f" |sort) <(cut -f2 < "$f" | sort)
- 将文件名保存在变量中有助于不重复
- 无需写入文件,然后进行比较。写入文件通常需要随后删除它们以进行清理。但不要对大文件执行此操作。进程替换使其看起来像是
comm
从文件中读取,而实际上是stdout
重定向到临时文件fd
答案2
使用不同的 awk 解决方案并且简单
awk 'NR==FNR{seencol1[$1]++;next} ($2 in seencol1)' infile.txt infile.txt
输出,
stringZ
stringT
答案3
您可以用来comm
比较 2 个文件,因此首先为每列生成一个排序文件:
cat filename | cut -f1 | sort > column1
cat filename | cut -f2 | sort > column2
然后抑制前 2 列以comm
仅显示两个文件中存在数据的行:
comm -12 col1 col2
答案4
awk 'NF!=1{cola[$1]++; colb[$2]++} END { for (item in cola ) { if( colb[item]>0 ) { print item } }' /path/to/input