次の行を含む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
指示されました。grep
sed
Report.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回解析できますが、これは面倒で問題が発生します。通常の状況ではスクリプトを入力するファイルのサイズがどれだけ大きいかわからない場合。