重複した項目に基づいて列を並べ替え、最初の項目を保持[重複]

重複した項目に基づいて列を並べ替え、最初の項目を保持[重複]

次のファイルがあります

1:A
2:B
3:A

私が必要とする出力は次のとおりです

1:A
2:B

3番目の項目の2番目の列には、最初の項目と同様にAが含まれているため、削除します。また、大文字と小文字を区別する必要があります。

容量が非常に大きいファイルなので、時間を節約してみると良いようです。

これを試してみましたが、一意の行だけが印刷されているようです。

sort -u -t':' -k3,3 file

ベストアンサー1

使用sort

Edが彼の本で言ったようにコメントsortコマンドは3番目のフィールドをソートしていますが、実際には2つのフィールド(:フィールド区切り文字)しかありません。したがって、問題を解決するには、キーを32

ただし、レコードが行/レコード番号の代わりにキー値に基づいてソートされると、ソースファイルの元のレコードの順序が混乱します。

$ sort -u -t':' -k2,2 test.txt 
1:A
2:B
6:C
5:a
4:b
$

これはおそらくいいえあなたは何が欲しいですか?ただし、この問題は出力を再パイピングすることで簡単に解決できますsort

$ sort -u -t':' -k2,2 test.txt | sort 
1:A
2:B
4:b
5:a
6:C
$

ノート--parallel:大きなファイルがあると述べたように、速度を上げるにはフラグ1を使用することをお勧めします。

sort --parallel=<n> -u -t':' -k2,2 test.txt | sort --parallel=<n>

<n>利用可能なコアの数はいつ取得されますか?

使用awk

サンプルファイルを展開すると、元のデータが次の名前のファイルにある場合test.txt

1:A
2:B
3:A
4:b
5:a
6:C

また、フィールド区切り記号と見なされるため、2を:使用できます。awk

たとえば、次の行は次のようになります。

awk 'BEGIN{FS=":"}{if (!seen[$2]++)print $0}' test.txt

次の結果を提供します。

$ awk 'BEGIN{FS=":"}{if (!seen[$2]++)print $0}' test.txt 
1:A
2:B
4:b
5:a
6:C
$

以下を使用してロジックを調べると、これがどのように機能するかを理解できます。

$ awk 'BEGIN{FS=":"}{print !seen[$2]++}' test.txt 
1
1
0
1
1
1
$
  • まず、フィールド区切り記号をで指定しますFS=":"
  • 第二に、否定演算子は、2番目のフィールド項目に対して「真」の結果を提供します。しかし、見えた。
  • 最後に、print $0レコード全体、つまり現在の行が印刷されます。

これをスクリプトの代わりにシェルスクリプト3に入れると、次のようになります。awk

#!/bin/sh

awk -F':' '
  (!seen[$2]++) {
    print $0
  }
' "$1"

引用する:

1回答到着大容量ファイルをソートする方法は?

2回答到着3つの列のうち2つの列の情報に基づいて一意の行を保持します。

3回答到着awkスクリプトヘッダーに追加フラグを付ける

おすすめ記事