繁体   English   中英

即使与awk不匹配,也要追加该行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM