[英]Appending the line even though there is no match with awk
我试图比较两个文件,如果满足某些条件,则附加另一列。
file1.txt
1 101 111 . BCX 123
1 298 306 . CCC 234
1 299 305 . DDD 345
file2.txt
1 101 111 BCX P1@QQQ
1 299 305 DDD P2@WWW
输出应该是:
1 101 111 . BCX 123;P1@QQQ
1 298 306 . CCC 234
1 299 305 . DDD 345;P2@WWW
我能做的是,只对匹配的行进行此操作:
awk 'NR==FNR{ a[$1,$2,$3,$4]=$5; next }{ s=SUBSEP; k=$1 s $2 s $3 s $5 }k in a{ print $0,a[k] }' file2.txt file1.txt
1 101 111 . BCX 123 P1@QQQ
1 299 305 . DDD 345 P2@WWW
但是,我错过了file1中的第二行。
即使与file2区域不匹配,我怎么能保留它?
如果要打印每一行,您需要打印命令不受您的条件限制。
awk '
NR==FNR {
a[$1,$2,$3,$4]=$5; next
}
{
s=SUBSEP; k=$1 s $2 s $3 s $5
}
k in a {
$6=$6 ";" a[k]
}
1' file2.txt file1.txt
1
是简写,表示“打印每一行”。 这是一个总是评估“真”的条件(没有命令语句)。
条件中的k in a
只是将现有的第6个字段替换为连接的字段。 如果不满足条件,则不会发生替换,但由于1
,我们仍然打印。
以下awk
可能会帮助你。
awk 'FNR==NR{a[$1,$2,$3,$4]=$NF;next} (($1,$2,$3,$5) in a){print $0";"a[$1,$2,$3,$5];next} 1' file2.txt file1.txt
输出如下。
1 101 111 . BCX 123;P1@QQQ
1 298 306 . CCC 234
1 299 305 . DDD 345;P2@WWW
另一个awk
$ awk ' {t=5-(NR==FNR); k=$1 FS $2 FS $3 FS $t}
NR==FNR {a[k]=$NF; next}
k in a {$0=$0 ";" a[k]}1' file2 file1
1 101 111 . BCX 123;P1@QQQ
1 298 306 . CCC 234
1 299 305 . DDD 345;P2@WWW
密钥的最后一个组件是基于第一或第二文件输入的第4或第5字段; 相应地设置它并在脚本中使用单个k
变量。 注意
t=5-(NR==FNR)
可按常规书写,
t=NR==FNR?4:5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.