彼はすべて、いくつかの列を含むファイルを持っています。列 2 の並べ替えを行い、列 1 に uniq を適用したいと思います。同じ列の並べ替えと uniq について話しているこの投稿を見つけましたが、私の問題は少し異なります。sort
andを使用して何かを使用することを考えてuniq
いますが、方法がわかりません。ありがとう。
4 に答える
パイプを使用できますが、設置されていません。
例 :
$ cat initial.txt
1,3,4
2,3,1
1,2,3
2,3,4
1,4,1
3,1,3
4,2,4
$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2
3,1,3
4,2,4
1,3,4
2,3,1
結果はキー 2 でソートされ、キー 1 で一意です。結果はコンソールに表示されることに注意してください。ファイルに保存する場合は、リダイレクト ( > newFiletxt
)を使用してください。
この種のより複雑な操作の他の解決策は、別のツールに依存することです (好み (および年齢) に応じて、awk、perl、または python)。
編集:新しい要件を正しく理解していれば、列2でソートされ、列1は特定の列2に対して一意です:
$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2
3,1,3
1,2,3
4,2,4
1,3,4
2,3,1
1,4,1
それはあなたが期待するものですか?そうでなければ、私は理解できませんでした:-)
私があなたの言うことを正しく理解したことを確認するためだけに。ファイルの2番目の列に基づいてファイルを並べ替えたいとします。次に、最初の列から重複を削除します(列1にuniqを適用するという別の言い方をします!)。これを行うには、次の3つのタスクを実行する必要があります。
- uniqが適用される列をソートします(uniqはソートされた入力でのみ機能するため)。
- ソートされた列にuniqを適用します。
- 2列目の値に基づいて出力を並べ替えます。
パイプの使用:コマンドは
sort -t ',' -k1 fileName| awk '!x[$1]++' | sort -t ',' -k2
uniqで最初のフィールドを指定することはできないことに注意してください。-f
スイッチを使用して、最初のフィールドをジャンプできn
ます。したがって、私はawk
を置き換えていましuniq
た。
私はこれを使いました
sort -t ',' -nk2
ここで並べ替え
1,2
2,5
3,1
to
3,1
1,2
2,5
uniq
機能するにはデータがソートされている必要があるため、sort
2番目のフィールドに適用uniq
してから最初のフィールドに適用すると、正しい結果が得られません。
あなたは試してみたいかもしれません
sort -u -t, -k1,1 filename | sort -t, -k2,2