私はマージする必要があるCSVをいくつか持っています。私は重複と同じ第1列と第2列を持つエントリを検討したい。 私は、このためのコマンドは、私はさらに第二のファイルからのエントリーが毎回選択されているような方法で重複を解消したい重複を解決している間に2つのCSVをマージする
sort -t"," -u -k 1,1 -k 2,2 file1 file2
のようなものであることを知っています。それを行う方法は何ですか?
私はマージする必要があるCSVをいくつか持っています。私は重複と同じ第1列と第2列を持つエントリを検討したい。 私は、このためのコマンドは、私はさらに第二のファイルからのエントリーが毎回選択されているような方法で重複を解消したい重複を解決している間に2つのCSVをマージする
sort -t"," -u -k 1,1 -k 2,2 file1 file2
のようなものであることを知っています。それを行う方法は何ですか?
提案は(動作しませんsort
コマンドにファイルの順序を逆にした場合他の答えを見てください)、これを行う別の方法はファイルを連結することです、まずを開いてから、-s
スイッチで並べ替えます。
cat file2 file1 | sort -t"," -u -k 1,1 -k 2,2 -s
-s
は、同一の行が同じ相対的な順序で表示されることを意味し、安定したソートを強制します。 sort
への入力にはfile2
の前にfile1
より前の行が含まれているため、出力の重複はすべてfile2
になります。
sort man pageには、入力ファイルがコマンドラインで指定された順序で読み込まれることが明示されていないため、インプリメンテーションでファイルを逆順に読み込むことや、または何でも。しかし、最初にファイルを連結するとあいまいさはありません。
2つのファイルの順序を変更し、-s
(@ Jim Mischelがヒットする)を追加すると、問題が解決します。
sort -t"," -u -k 1,1 -k 2,2 -s file2 file1
man sort
-u, --unique
with -c, check for strict ordering; without -c, output only the
first of an equal run
-s, --stable
stabilize sort by disabling last-resort comparison
短い答え
awk -F"," '{out[$1$2]=$0} END {for(i in out) {print out[i]}}' file1 file2
ビット長の答え:
awk 'BEGIN {
FS=OFS=","; # set ',' as field separator
}
{
out[$1$2]=$0; # save the value to dict, new value would replace old value.
}
END {
for (i in out) { # in the end, print all value of the dict
print out[i];
}
}' file1 file2
あなたが直面している問題は何ですか?あなたのコマンドは私にとってうまくいくようです( '-k 1,1 -k 2,2'を' -k 1,2 'にグループ化することはできますが、私は信じています)。 '-u'オプションはあなたが選択したキーの一意の行を与えるはずです。 2番目のファイルに優先順位を付けるには、最初にファイルを配置します。 – silel