2011-06-30 2 views
1

ただ一つのCSVファイルを別のものから差し引いても構いませんが、行が同じでない場合はそうではありません。行を比較する代わりに、1つのフィールドに一致する行があるかどうかを調べたいと思います。BASH行ごとにキー行をファイルにする

resultfile私はuは私が何を意味するか知っていると思う

EMAIL;NAME;SALUTATION;ID 
[email protected];Bar;Ms;2 

する必要があります最初のファイル

EMAIL;NAME;SALUTATION;ID 
[email protected];Foo;Mr;1 
[email protected];Bar;Ms;2 

と第二のファイル

EMAIL;NAME 
[email protected];Foo 

;)で可能ということですどのように

bash? Javaでこれを行うのは簡単ですが、私は実際にbashでそれを行う方法を学びたいと思います。また、私は並べ替えを使用して行を比較することによって引くことができます

#!/bin/bash  
echo "Substracting Files..." 

sort "/tmp/list1.csv" "/tmp/list2.csv" "/tmp/list2.csv" | uniq -u >> /tmp/subList.csv 

echo "Files successfully substracted." 

しかし、行は同じタプルではありません。だから私はキーとラインを比較しなければならない。

提案がありますか?おかげでたくさんの..ニルス

答えて

4

一つに来る可能な解決策私の心はこれです(bashで作業しています):

grep -v -f <(cut -d ";" -f1 /tmp/list2.csv) /tmp/list1.csv 

意味:
cut -d ";" -f1 /tmp/list2.csv:2番目のファイルの最初の列を抽出します。
grep -f some_file:パターンソースとしてファイルを使用します。
<(some_command):これはプロセスの代用です。それはコマンドを実行し、出力をgrep -fへのファイル入力として使用できる名前付きパイプに送ります。
grep -v:パターンに一致しない行だけを印刷します。

+1

ニース、UNIX-fooというのエレガントな使用、カット/ grepのが行います場合はawkの必要はありませんコンソールでは正常に動作 – Marcin

+0

が、使用した(awkは時々、何のハードルールはありません、結果は私に何度も驚いている速いかもしれませんが) /tmp/substract.sh:4:構文エラー: "(予期しない – Nils

+0

@Nils:'#!/ bin/bash'や '#!/ bin/sh'を使用していますか? 。!*プロセス置換が* 'bash'機能ですので、私は最初の' bash'oneを使用 – bmk

1

更新:joinawk経由質問へのソリューション、。救助へ

$ join -1 1 -2 1 -t";" --nocheck-order -o 1.1,1.2,1.3,1.4 1.csv 2.csv 
EMAIL;NAME;SALUTATION;ID 
[email protected];Foo;Mr;1 

join

join --header -1 1 -2 1 -t";" --nocheck-order -v 1 1.csv 2.csv | | awk 'NR==1 {print gensub(";[^;]\\+$","","g");next} 1'  

これらは逆の答えでした。

それとも-oなしNAMEフィールドを印刷するスキップ:。

$ join -1 1 -2 1 -t";" --nocheck-order 1.csv 2.csv | awk 'BEGIN {FS=";" ; OFS=";"} {$NF=""; print }' 

(しかし、それはまだ最後のフィールドの後にプラス;を印刷し

HTH

+2

は逆ではありませんか?参加できない行をjoinで返すことができますか? – sehe

+0

どのようにダブルフィールド(あなたの場合は名前)を避けるために、私には5つの一致するフィールドがあり、それらはすべて行に追加して混乱のように見えます。 – Nils

+0

答えが更新されました。 –

関連する問題