次のファイルがあります
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つのフィールド(:
フィールド区切り文字)しかありません。したがって、問題を解決するには、キーを3
。2
ただし、レコードが行/レコード番号の代わりにキー値に基づいてソートされると、ソースファイルの元のレコードの順序が混乱します。
$ 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"
引用する: