2つのファイルの最初の列に基づいて2つのファイルを比較し、一致する行と一致しない行を取得します。

2つのファイルの最初の列に基づいて2つのファイルを比較し、一致する行と一致しない行を取得します。

最初の列に基づいて2つのタブで区切られたファイルを比較し、最初の列が2番目のファイルと一致する場合は、最初のファイルの行全体を印刷する必要があります。また、最初のファイルにはありませんが、2番目のファイルにある項目を抽出する必要があります。

ファイル1.txt:

chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254

ファイル2.txt:

chr12_56487682_T_A
chr19_9088697_T_C
chr11_108180929_T_-
chr1_45796909_C_T
chr19_9002597_C_T
chr1_45797139_G_A
chr1_45796900_G_C
chr2_48030697_T_G
chr7_151927025_A_G
chr1_45795114_G_A
chr1_211542902_G_-

希望の出力:

chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254
chr19_9088697_T_C   0
chr11_108180929_T_- 0
chr19_9002597_C_T   0
chr2_48030697_T_G   0
chr7_151927025_A_G  0
chr1_211542902_G_-  0

目的の結果を得るために、次のコードを使用しようとしています。

コード1は合計を比較し、file1そのfile2合計から一致する行を抽出しますfile1

awk -F "\t" 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file1 file2 > matching_rows.txt

コード2は合計を比較し、file1そのfile2合計から一致しない行を抽出しますfile2

awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file1 file2 > nonmatching_rows.txt

次に接続matching_rows.txtしてnonmatching_rows.txt使用します。

cat matching_rows.txt nonmatching_rows.txt > combined.txt

2番目の列のスペースを置き換えるために、次のコードを使用しました。

awk 'NF && $2==""{$2=0}1' FS="\t" OFS="\t" combined.txt > desired_output.txt

私の質問は100以上のファイルをfile2

答え1

ただ食べるアッ- 2つのファイルを含むスクリプト。最初のファイルを読み取ると、ID値を格納する配列が埋められます。

2 番目のファイルを読み取る場合は、以前に保存した値とともに各 ID を印刷します。保存した値がない場合は、1つが印刷されます0

FILENAME現在読んでいるファイルを区別するには、現在処理中のファイル名を含むawk-Vaiableを使用します。

ああ
        ファイル名=="ファイル1.txt"{
                #値の配列にIDを入力します。
                ID = $1
                値[ID] = $2
        }
        ファイル名=="file2.txt"{
                ID = $1
                #設定されていない配列項目のデフォルトの内容は空の文字列です。
                if (val[id] == "") {
                        # val[] には値は格納されていません。
                        印刷ID "\t" 0
                }その他{
                        印刷ID "\t" val[id]
                }
        }
'ファイル1.txtファイル2.txt

(上記の例は最適化されているかもしれませんが、理解しやすいことを願っています。)

答え2

file1 の最初の列を grep コマンドの検索パターンとして使用できます。これにより、一致する2番目の列がないfile2のエントリがフィルタリングされます。

$ cp file1.txt outfile
$ awk '{print $1}' file1 > patterns

(該当パターンは後で削除できる一時ファイルです。)

それから:

$ grep -v -f patterns <file2 >>outfile
$ cat outfile
chr1_45795114_G_A   0.004251803
chr1_45796900_G_C   0.019459893
chr1_45796909_C_T   0.003777726
chr1_45797139_G_A   0.006444843
chr12_56487682_T_A  0.003622254
chr19_9088697_T_C
chr11_108180929_T_-
chr19_9002597_C_T
chr2_48030697_T_G
chr7_151927025_A_G
chr1_211542902_G_-

空の2番目の列にタブ区切りのゼロを使用する必要がある場合は、次のように使用します。

$ awk 'NF==2{print $0} NF<2{print $1,"\t0"}' 出力ファイル

答え3

for file in f1 f2 f3 f4
do
awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file2  $file >>output.txt
awk 'NR==FNR{a[$1];next}!($1 in a){print $0"\t""0" }' $file file2 >>output.txt
done

ここで、各反復の出力は output.txt ファイルに保存されます。

各反復出力を別々のファイルに保存する必要があると仮定すると、次の手順に従う必要があります。

for file in f1 f2 f3 f4
do
awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file2  $file >$file_file2
awk 'NR==FNR{a[$1];next}!($1 in a){print $0"\t""0" }' $file file2 >>$file_file2
done

関連情報