2017-09-24 16 views
1

に出力関数diffの内容を、私はそうのようなファイルを持っている:bashの:2列

file1.txt 
rs13339951:45007956:T:C 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576 5353566 

file2.txt 
rs13339951 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576:ATCFHF 5353566 

詳しい説明:

  • は、カラム1の値の一部は、2つのファイル間で同一であり、しかし、column2のではないすべての
  • 値は、すべての2つのファイル間で同一である
  • 私は識別したい

2つのファイル間でcolumn1の値が異なる行。私。これらの行1と4は私の例です。 diff file1.txtとfile2.txtでこれを行うことができます。

しかし、このようなエンドファイルを取得したいと思います(下記参照)。実際には、sedを使用して、一方のファイルの名前を他方のファイルの名前に置き換えて、両方のファイルが完全に一致するようにします。

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 
+0

何を試しましたか?あなたは 'awk'あるいは多分' join'でこれを行うことができます。 – codeforester

+0

私は次のようなことを考えていました: diff file1.txt file2.txt | grep \^\ <| sed's/< //' > part1.txt diffファイル1.txtファイル2.txt | grep \^\> | sed's /> // '> part2.txt そして、何らかの形で、上記のような1つのファイルを取得するために位置に基づいて2つのファイルを照合します。それはちょうどかなり不器用で退屈なようです。私は同時に500以上のファイルに対してこれを行う必要がありますので、1つのコマンドがうまくいくでしょう。 – m93

答えて

1

awkは我々はAWKに2つのファイルを渡しているこの

awk 'FNR==NR {a[$2]=$1; next} a[$2]!=$1 {print a[$2] " " $1}' file1 file2 

出力

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 

に最適です。それはそれらを連続して通過します。

FNR==NR {.... next} { ... } 

この「トリック」では、最初のファイルに対して最初のアクションが実行され、2番目のファイルに対して2番目のアクションが実行されます。

a[$2]=$1 

キー値ルックアップテーブル。 2番目の列はキーの最初の列は値です。このルックアップテーブルは、最初のファイルを読み込みながら作成します。

a[$2]!=$1 {print a[$2] " " $1} 

2番目のファイルを反復処理している間は、現在の最初の列とルックアップテーブルの値を比較します。一致しない場合は、目的の出力を印刷します。

+0

ありがとう!このコードの各部分が何をしているのかを正確に説明することは可能でしょうか?私はあなたのコマンドの各部分が何をしているのか正確にはわからないので、私はかなり新しくなっています – m93

+0

@ m93私の答えを更新しました。さらなる質問がある場合はお知らせください。 –

+0

ありがとう、本当に助かりました! – m93