2つの別々の列にある場合は、文字列を印刷します。

2つの別々の列にある場合は、文字列を印刷します。

2つの列を持つテキストファイルがあり、両方の列にある文字列のみを印刷したいと思います。たとえば、

column1       column2

stringA       stringZ
stringP       stringT
stringZ       stringX
stringE       stringR
stringT       stringG

予想出力:

stringZ
stringT

答え1

いくつかの改善点を含め、@cherdtからはっきりと盗まれましたzshbashksh

f=filename; comm -12 <(cut -f1 < "$f" |sort) <(cut -f2 < "$f" | sort)
  • ファイル名を変数に保存すると、重複しないようになります。
  • ファイルに書き込んでから比較する必要はありません。通常、ファイルを書き込むには、後でクリーンアップするために削除する必要があります。しかし、大容量ファイルにはこれをしないでください。プロセス置換を使用すると、実際に一時ファイルにリダイレクトするcommときにファイルから読み取られるように見えます。stdoutfd

答え2

他のawkソリューションを使用して簡単にしてください

awk 'NR==FNR{seencol1[$1]++;next} ($2 in seencol1)' infile.txt infile.txt 

出力、

stringZ
stringT

答え3

を使用して2つのファイルを比較できるcommので、最初に各列に対してソートされたファイルを作成します。

  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

関連情報