打印字符串(如果存在于两个单独的列中)

打印字符串(如果存在于两个单独的列中)

我有一个包含两列的文本文件,我只想打印两列中都存在的字符串。例如:

column1       column2

stringA       stringZ
stringP       stringT
stringZ       stringX
stringE       stringR
stringT       stringG

预期输出:

stringZ
stringT

答案1

无耻地从 @cherdt 窃取并进行了一些改进(假设有类似 shellzshbash支持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 个文件,因此首先为每列生成一个排序文件:

  1. cat filename | cut -f1 | sort > column1
  2. 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

相关内容