3

次のようなファイルがあります。

1 2 3 
4 5 6
7 6 8
9 6 3
4 4 4

n番目の列の一意の要素を別のファイルに出力できるワンライナーは何ですか?

編集:これは人々が与えた解決策のリストです。みんなありがとう!

cat in.txt | cut -d' ' -f 3 | sort -u
cut -c 1 t.txt | sort -u
awk '{ print $2 }' cols.txt | uniq
perl -anE 'say $F[0] unless $h{$F[0]}++' filename
4

5 に答える 5

10

以前のPerlでは5.10

perl -lane 'print $F[0] unless $h{$F[0]}++' filename

その後のPerlで5.10

perl -anE 'say $F[0] unless $h{$F[0]}++' filename

出力する列に置き換え0ます。

j_random_hacker の場合、メモリをほとんど使用しない実装を次に示します (ただし、速度が遅くなり、より多くの入力が必要になります)。

perl -lane 'BEGIN {dbmopen %h, "/tmp/$$", 0600; unlink "/tmp/$$.db" } print $F[0] unless $h{$F[0]}++' filename

dbmopenは、 DBMファイル (作成または開くファイル) と %h という名前のハッシュとの間のインターフェースを作成します。%h に保存されているものはすべて、メモリではなくディスクに保存されます。unlinkでファイルを削除すると、プログラムが終了した後にファイルが残ることはありませんが、現在のプロセスには影響しません (POSIX 規則に従って、開いているファイルハンドルはファイルシステムによって実際のファイルとして扱われるため)。

于 2009-08-14T04:38:19.490 に答える
6

訂正:ありがとう、マーク・ルシャコフ。

$ cut -c 1 t.txt | sort | uniq

また

$ cut -c 1 t.txt | sort -u


1
4
7
9
于 2009-08-14T04:37:31.690 に答える
3

3 番目の列の一意の値を取得します。

$ cat in.txt | cut -d' ' -f 3 | sort -u
3
4
6
8

cut -d' 'スペースで区切られた入力を分離することを意味し、-f 3部分は3番目のフィールドを取ることを意味します。最後に、sort -u一意のエントリのみを保持して、出力を並べ替えます。

于 2009-08-14T04:34:43.147 に答える
3

ファイルが「cols.txt」で、2 番目の列の一意の要素が必要だとします。

awk '{ print $2 }' cols.txt | uniq

このようなユーティリティの詳細については、次の記事が役立ちます。

于 2009-08-14T04:38:04.730 に答える
2

awk を使用する場合、他のコマンドを使用する必要はありません

awk '!_[$2]++{print $2}' file
于 2009-08-14T13:40:34.120 に答える