2つの列を持つテキストファイルがあり、両方の列にある文字列のみを印刷したいと思います。たとえば、
column1 column2
stringA stringZ
stringP stringT
stringZ stringX
stringE stringR
stringT stringG
予想出力:
stringZ
stringT
答え1
いくつかの改善点を含め、@cherdtからはっきりと盗まれましたzsh
。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
を使用して2つのファイルを比較できるcomm
ので、最初に各列に対してソートされたファイルを作成します。
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