グループ固有のコマンド?

グループ固有のコマンド?

次の形式のファイルからインポートするコマンドを探しています。

hello 32
hello 67
hi    2
ho    1212
ho    1390
ho    3000

この形式を使用すると(「グループ」の最後の行を取得して重複排除):

hello 67
hi    2
ho    3000

現在私はPythonとpandasスニペットを使用しています。

    df = pd.read_csv(self.input().path, sep='\t', names=('id', 'val'))

    # how to replace this logic with shell commands?
    surface = df.drop_duplicates(cols=('id'), take_last=True)

    with self.output().open('w') as output:
        surface.to_csv(output, sep='\t', cols=('id', 'val'))

更新:素晴らしい答えに感謝します。以下はいくつかのベンチマークです。

入力ファイルサイズは246Mで、8583313行を含みます。順序は重要ではありません。最初の列のサイズは9文字で固定されています。

入力ファイルの例:

000000027       20131017023259.0        00
000000027       20131017023259.0        11
000000035       20130827104320.0        01
000000035       20130827104320.0        04
000000043       20120127083412.0        01
...

                              time        space complexity

tac .. | sort -k1,1 -u        27.43682s   O(log(n))
Python/Pandas                 11.76063s   O(n)
awk '{c[$1]=$0;} END{for(...  11.72060s   O(n)

最初の列の長さは固定されているため、次のものを使用することもuniq -wできます。

tac {input} | uniq -w 9        3.25484s   O(1)

ベストアンサー1

これは狂ったようで、より良い方法があったらと思いますが、次のようになります。

tac foo | sort -k 1,1 -u

tacファイルを反転して最初のファイルの代わりに最後のファイルをインポートするために使用されます。

-k 1,1比較のために最初のフィールドだけを使用すると言います。

-uユニークに作ってください。

おすすめ記事