
複数のフィールドを含むファイルがあります。
12345 some values here
67890 other values maybe
12345 different values here
...など。
見せたい最近各キーの行です。出力は次のようになります。
67890 other values maybe
12345 different values here
出力では、キーは一意でなければならず、値(行の残りの部分)はそのキーに対して最も最近表示された値でなければなりません。私はキーの最終的な順序に特に興味がありません。
GNU(またはPOSIX)ツールを使用してこれをどのように実行できますか?
答え1
awk '{ data[$1] = $0 } END { for (key in data) print data[key] }' file
data
これにより、最初のフィールドをキーとして配列の各行のデータが保存されます。同じ最初のフィールドを持つ別の行が見つかった場合は、そのキーの古いデータが上書きされます。
最後に、配列のすべてのデータを出力します。
改善されたメモリ効率:
sort -k1,1 -s file |
awk 'NR > 1 && $1 != key { print data } { data = $0; key = $1 } END { print data }'
ここでは、最初に安定したソートアルゴリズム()を使用して、最初の列でのみファイルをソートします-s
。安定したソートアルゴリズムを使用することは、同じキーを持つ行が出力内の相対位置を変更しないことを意味しますsort
。
その後、コードはawk
単に「現在のキー」とそのキーの最新のデータを追跡し、キーが変更されると(最後に)そのデータを印刷します。
答え2
ファイルを裏返して各行を出力します。最初時間を確認して出力を反転します。
tac file | awk '!seen[$1]++' | tac