最初の列に基づいて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