簡體   English   中英

在公共列上合並兩個文件並使用awk打印所有列

[英]Merging two files on a common column and printing all columns using awk

我有兩個很長的空格分隔文件,看起來像這樣:

文件1:

CHR SNP   A1 A2 MAF
1    rs12  A G  0.43
1    rs1   A T  0.22
1    1:30  G A  0.012
1    rs23  G A  0.012

文件2:

SNP    CHR A1 A2 MAF CHR:BP
rs21   1   G  A  0.03 1:30
rs13   1   T  A  0.06 1:122
rs23   1   A  G  0.02 1:234

我想將它們合並在一起,當文件1的第2列適合文件2的第1列或文件2的第6列並打印兩個文件中的所有列時。

所以該示例的輸出應為:文件3

SNP  CHR A1 A2 MAF CHR:BP CHR SNP  A1 A2 MAF
rs21 1   G  A  0.03 1:30   1  1:30 G  A  0.012
rs23 1   A  G  0.02 1:234  1  rs23 G  A  0.012

我用下面的代碼:

awk 'NR==FNR{a[$2]=$0;next} ($1 in a || $6 in a){print $0 FS a[$2]}' file1 file2 > file3

但是由於某種原因,它會過濾掉正確的行,但只打印file2的列,而不打印file1的列。

我也嘗試使用join,但是即使文件已排序,它也給我帶來奇怪的結果。 奇怪的意思是,它忽略了兩個文件中實際存在的大約1/5的行。 只是為了完成,這是我嘗試使用join的代碼:

join -1 2 -2 1 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1) <(sort -k1 file2) > file3.1

join -1 2 -2 6 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 1.1 1.2 1.3 1.4 1.5 1.6' <(sort -k2 file1) <(sort -k6 file2) > file3.2

cat file3.1 file 3.2 > file3

有人看到我的錯誤嗎? 我將非常感激。 謝謝!

您的錯誤出在您的print命令中:

{print $0 FS a[$2]}

應該

{print $0, ( $1 in a ? a[$1] : a[$6] )}

因為(1)當您在file1中時,“有趣的”字段僅在$2而不是遍歷file2 ,並且(2)您需要根據您的任一條件從數組中提取數據。 我們可以使用經典的三元運算符選擇哪個數組元素。 (為了方便閱讀,我添加了額外的間距。)

請注意使用逗號(用OFS分隔字段),而不是使用FS即輸入字段分隔符)。

否則,您的代碼對我來說看起來不錯。

您可以嘗試以下嗎?

awk 'FNR==NR{a[$2]=$0;next} ($1 in a) || ($6 in a){print $0,a[$1]?a[$1]:a[$6]}'  Input_file1  Input_file2

在這里也添加非單一襯里形式的解決方案。

awk '
FNR==NR{
  a[$2]=$0
  next
}
($1 in a) || ($6 in a){
  print $0,a[$1]?a[$1]:a[$6]
}'  Input_file1   Input_file2

> file3附加到上述文件中,以將輸出輸入到file3中。

編輯:現在也為OP的代碼添加解決方案。

awk 'NR==FNR{a[$2]=$0;next} ($1 in a || $6 in a){print $0 FS a[$1]?a[$1]:a[$6]}' file1 file2 > file3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM