Awk 如何导入与两个文件中的一个公共字段相对应的其他列中的字段,在所有不匹配的列中使用'NA'
我想问一个关于我之前发布的问题的后续问题: 我正在试图找出当我有几个不匹配的值时如何打印Awk 如何导入与两个文件中的一个公共字段相对应的其他列中的字段,在所有不匹配的列中使用'NA',awk,Awk,我想问一个关于我之前发布的问题的后续问题: 我正在试图找出当我有几个不匹配的值时如何打印NA File1 rs1 AA 10 rs2 BB 20 rs3 CC 30 rs4 DD 40 File2 rs1 QQ TT UU rs3 RR WW rs4 ZZ Desired output rs1 AA 10 QQ TT UU rs2 DD 20
NA
File1
rs1 AA 10
rs2 BB 20
rs3 CC 30
rs4 DD 40
File2
rs1 QQ TT UU
rs3 RR WW
rs4 ZZ
Desired output
rs1 AA 10 QQ TT UU
rs2 DD 20 NA NA NA
rs3 EE 30 RR WW NA
rs4 RR 40 ZZ NA NA
仅当整个$0
丢失时,此代码才会打印NA
:
awk 'FNR==NR{a[$1]=$0;next}{print $0,a[$1]?a[$1]:"NA"}' file2 file1
Current output:
rs1 AA 10 QQ TT UU
rs2 DD 20 NA
rs3 EE 30 RR WW
rs4 RR 40 ZZ
像这样的
awk 'FNR==NR{for (i=2;i<=NF;i++) a[i,$1]=$i;next}{printf "%s\t",$0; for (i=2;i<=6;i++) printf "%s\t",(a[i,$1]?a[i,$1]:"NA");print ""}' f2 f1
rs1 AA 10 QQ TT UU NA NA
rs2 BB 20 NA NA NA NA NA
rs3 CC 30 RR WW NA NA NA
rs4 DD 40 ZZ NA NA NA NA
awk'FNR==NR{for(i=2;i试试这个:
awk '
BEGIN {OFS = "\t"}
FNR == NR {
if (NF > 1) {
if (NF > maxnf) maxnf = NF
nf[$1] = NF
a[$1] = $2
for (i = 3; i <= NF; ++i) a[$1] = a[$1] "\t" $i
}
next
}
{
if (NF < 3) {$3 = $2; $2 = " "}
else $1 = $1 # ensure fields are separated by tabs
printf($0)
n = 1
if ($1 in a) {n = nf[$1]; printf("\t%s", a[$1])}
for (i = n; i < maxnf; ++i) printf("\tNA");
print""
}
' file2 file1
谢谢。问题是我有很多专栏,这使得这段代码有点不可行。@user2162153更新了我的帖子。谢谢,我想(I=2;i@Yes,但您确实编写了我有许多列
,因此您需要根据需要对其进行调整:)谢谢,它适用于上面的示例文件,几乎适用于我的实际文件。有一个问题,我假设I=3
指的是您要导入的第一列,而不是中的“\t”
(I=3;I@user2162153a[$1]=$2
行保存字段2。然后循环将字段3附加到NF,由制表符分隔。请参阅编辑以将制表符转换为空格。什么不适用于您的实际文件?谢谢。上面的示例中不存在该字段,但如果文件2
中的索引列没有值,则导入一个空字段,结果会有一个blank字段,然后您有NA
。例如,如果file2
中的rs4
在其他字段中没有任何值,您将有rs4 DD 40 NA
@user2162153一个小编辑(添加和&NF>1
)可能会解决此问题。请尝试上面编辑的代码。谢谢,抱歉,还有一个问题。如果file1
的某些列中有空字段,则这些字段将在输出中被替换,例如,如果是rs1 10
,而不是rs1 AA 10
,10
则不会保留在输出的第三列中,而是被移动到第二列。
rs1 AA 10 QQ TT UU
rs2 BB 20 NA NA NA
rs3 CC 30 RR WW NA
rs4 DD 40 ZZ NA NA