一意の列から行を取得する方法は?

一意の列から行を取得する方法は?

次の行を含むASCIIファイル(Report.dat)があります。

a  ./L1/file2.txt
c  ./L1/file1.txt
b  ./L2/file1.txt
a  ./L2/file2.txt

次のように、最初の列の一意の行のみを取得する必要があります。

c  ./L1/file1.txt
b  ./L2/file1.txt

AWK、sort、またはuniqコマンドを使用してこれをどのように実行できますか?

ベストアンサー1

独自の「タグ」を取得する方法は次のとおりです。

$ awk '{ print $1 }' Report.dat | sort | uniq -u
b
c

^以下を追加して、文字列を行の先頭に一致する正規表現に変換できます。

$ awk '{ print $1 }' Report.dat | sort | uniq -u | sed 's/^/^/'
^b
^c

次の正規表現を元のファイルに適用して、対応する行を取得できます。

$ awk '{ print $1 }' Report.dat | sort | uniq -u | sed 's/^/^/' | grep -f /dev/stdin Report.dat
c  ./L1/file1.txt
b  ./L2/file1.txt

我々は正規表現を取得し、それを使用して一致を実行するようにgrep -f /dev/stdin指示されました。grepsedReport.dat


または、このsedステップをスキップしてください。

awk '{ print "^" $1 }' Report.dat | sort | uniq -u | grep -f /dev/stdin Report.dat

または、以下からすべての操作を実行できますawk

awk 'NR == FNR { c[$1]++; next } c[$1] == 1' Report.dat Report.dat

ファイルを2回読みます。最初は、単に各「タグ」の発生回数を計算します。第二に、そのラインを印刷する前に、現在のラインのラベルをテストして、そのラインの数が1であることを確認します。

ファイルを2回解析することはできません。ファイル全体をメモリに保存し、そこから2回解析できますが、これは面倒で問題が発生します。通常の状況ではスクリプトを入力するファイルのサイズがどれだけ大きいかわからない場合。

おすすめ記事