2016-06-24 3 views
0

2つのファイルがあります。他にはもっと多くのものがあります。他のファイルの残りの部分を無視しながら、最初の18列だけが一致しない行を見つける必要があります。ただし、行全体を保存して印刷する必要があります(カットは機能しません)。bashの2つのファイルにまたがる最後のN列をすべて比較します。

ファイル1:

F1 F2 F3....F18 
A B C.... Y 
AA BB CC... YY 

ファイル2:

F1 F2 F3... F18... F32 
AA BB CC... YY... 123 
AAA BBB CCC... YYY...321 

出力されていないファイル1:ファイル2では

AAA BBB CCC YYY...321

出力されません:

A B C...Y 

可能であれば、できるだけ少ないループでdiffまたはawkを使用したいと思います。

あなたがawkを使用することができます
+3

あなたが私たちにcoたとえば、5つのうち3つの列を一致させて例を作成します。 –

+0

フィールドを使って説明しようとしていました。 F1 F2 F3 ... F18は最初の4列、F32は第2ファイルにのみ存在すると仮定します。私は最初の4つを比較したいだけですが、私はその5番目の列を保存し、それを出力に持ち帰りたいと思います。これは物事をクリアすることを願っています。 –

+1

あなたの質問を表示する**簡潔でテスト可能な**サンプル入力と期待される出力。すなわち、あなたが表示している出力を生成するために、いくつかの入力に対して潜在的な解決策を実行することができます(すべての '...'を取り除きます)。それに加えて他の説明/情報もいいですが、それが私たちが必要とする重要なものです。 –

答えて

0

:我々は最初の反復しながら、私たちは、その後、連想配列で、このキーを格納している最初の18フィールド

  • を連結して、キーを作成している両方のファイルの行ごとに

    awk '{k=""; for(i=1; i<=18; i++) k=k SUBSEP $i} FNR==NR{a[k]; next} !(k in a)' file1 file2 
    
    • を最初のファイル
    • 最後に、この新しいキー値が連想配列で見つからない場合、2行目の各行を出力します。あなたがgrepを使用することができます
  • +0

    2番目のファイルのみを印刷していることをどのように知ることができますか?ちょっと興味があるんだけど。 awkはまだ私にとって謎です。 –

    +1

    2番目のファイルhttp://stackoverflow.com/a/32488079/3220113 –

    +0

    'awk'コマンドの後に' file2'が2番目のファイルであるため、2番目のファイルから行を出力しています。 '!(k in a)'はawkが2番目のファイルから各行を印刷するようにするアクションです – anubhava

    0

    :2つのファイルのセットの違いを取得するために

    grep -vf file1 file2 
    grep -vf <(cut -d" " -f1-18 file2) file1 
    
    0

    を、あなたは、@ anubhavaの答え

    $ awk 'NR==FNR{f1[$0]; next} 
           {k=$1; for(i=2;i<=18;i++) k=k FS $i; 
           if(k in f1) delete f1[k]; 
           else f2[$0]} 
          END{print "not in f1"; 
           for(k in f2) print k; 
           print "\nnot in f2"; 
           for(k in f1) print k}' file1 file2 
    

    に似て、もう少し必要があります再度書き込むことができますファイル2で注文を保存する

    $ awk 'NR==FNR{f1[$0]; next} 
           {k=$1; for(i=2;i<=18;i++) k=k FS $i; 
           if(k in f1) delete f1[k]; 
           else {if(!p) print "not in f1"; 
             f2[$0]; print; p=1}} 
          END{print "\nnot in f2"; 
           for(k in f1) print k}' file1 file2 
    
    関連する問題