2017-04-19 7 views
1

私はマージする必要があるCSVをいくつか持っています。私は重複と同じ第1列と第2列を持つエントリを検討したい。 私は、このためのコマンドは、私はさらに第二のファイルからのエントリーが毎回選択されているような方法で重複を解消したい重複を解決している間に2つのCSVをマージする

sort -t"," -u -k 1,1 -k 2,2 file1 file2 

のようなものであることを知っています。それを行う方法は何ですか?

+0

あなたが直面している問題は何ですか?あなたのコマンドは私にとってうまくいくようです( '-k 1,1 -k 2,2'を' -k 1,2 'にグループ化することはできますが、私は信じています)。 '-u'オプションはあなたが選択したキーの一意の行を与えるはずです。 2番目のファイルに優先順位を付けるには、最初にファイルを配置します。 – silel

答えて

1

提案は(動作しませんsortコマンドにファイルの順序を逆にした場合他の答えを見てください)、これを行う別の方法はファイルを連結することです、まずを開いてから、-sスイッチで並べ替えます。

cat file2 file1 | sort -t"," -u -k 1,1 -k 2,2 -s 

-sは、同一の行が同じ相対的な順序で表示されることを意味し、安定したソートを強制します。 sortへの入力にはfile2の前にfile1より前の行が含まれているため、出力の重複はすべてfile2になります。

sort man pageには、入力ファイルがコマンドラインで指定された順序で読み込まれることが明示されていないため、インプリメンテーションでファイルを逆順に読み込むことや、または何でも。しかし、最初にファイルを連結するとあいまいさはありません。

1

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 
+0

ファイルの順序を逆にすることはできますか?私はそれがどこに文書化されて見つけることができませんでした。 – ishan3243

+0

@ ishan3243ファイルの順序を変更しても問題は解決しません。どのように 'awk'を使用すると、あなたの問題を解決できますか? – luoluo

+1

'-s'オプションをソートに追加すると、入力ファイルの順序を逆転させるだけでなく、重複があるときに' file2'の項目が確実に勝つようにすることができます。 –

関連する問題