grep、awk、sed、file1 と file2 の列 2 と列 3 の一致を印刷します。

grep、awk、sed、file1 と file2 の列 2 と列 3 の一致を印刷します。

編集:file1.txtの列1,2をfile2.txtの列1,3と一致させ、file2.txtの一致行を印刷したいと思います。

ファイル1.txt:

scaffold1   57482
scaffold1   63114
scaffold1   63118
scaffold1   63129
scaffold1   63139
scaffold1   63279
scaffold1   63294
scaffold2   65015
scaffold2   77268
scaffold2   77335

ファイル2.txt:

scaffold1   381 382 T/A +
scaffold1   384 385 T/A,G   +
scaffold1   385 386 G/C +
scaffold1   445 446 C/T +
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +

出力.txt:

scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +

答え1

解決策awk

$ awk 'NR==FNR{a[$1$2]++;next}{if($1$3 in a){print}}' file1 file2 
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +

NR現在の行番号とFNR現在のファイルの現在の行番号。 2 つは、最初のファイルを読み取る場合にのみ同じです。したがって、最初のブロックは最初のファイルを読み取るときにのみ実行されるため、最初のファイルの最初と2番目のフィールドが配列に保存されますa。次に、2番目のファイルを処理するときに最初と3番目のフィールドがある場合にのみその行を印刷します。つまり、a最初のファイルにある場合にのみその行を印刷します。

答え2

例のデータが一般化されると、次のようないくつかの仮定を行うことができます。

  • ファイル1の列2をファイル2の列3と一致させるだけです。
  • 入力ファイルは上記の列に基づいてソートされます。

これらの仮定が合理的であれば、次のjoinコマンドが機能します。

join -1 2 -2 3 -o "1.1,2.2,2.3,2.4,2.5" file1.txt file2.txt > output.txt

出力は次のとおりです

scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +

あるいは、これらの仮定が有効な仮定でない場合は、列を少し並べ替えてからawk(具体的にはファイル1の列1,2とファイル2の列1,3を組み合わせて)、次のsort(要件に応じてjoin)を実行できます。これにより、join結合された列が一致します。

join -o "1.2,2.2,2.3,2.4,2.5" <( awk '$1=$1"_"$2" "$1' file1.txt | sort ) <( awk '$1=$1"_"$3' file2.txt | sort )

答え3

必須フィールドをキャプチャするには、「cut」を試してください。たとえば、次のようになります。

cut -d$"\t" -f2 file1.txt | sort | > file1_col2.txt

ユーザー cuonglm は awk を使用してファイルを比較し、一致を印刷する方法の良い概要を提供します。

両方のファイルの一致する行を比較し、肯定的な結果を保存します。

関連情報