我有三个文件f1.txt,f2 .txt和f3。 txt具有不同大小的列,如下所示。我试图将file2的模式与文件1匹配,如果找到匹配,则将文件1内容替换为该特定匹配的文件3。事实上,文件2和文件3是相似的,但文件3是带有前导零
文件1:
8841
841
526
548
547
88
98
文件2:
841
526
548
547
文件3:
00841
0526
000548
00547
所需的输出位于文件1中,或者可能是其他文件
8841
00841
0526
000548
00547
88
98
我正在尝试使用上一篇文章中的单行命令,但这是用于匹配文件,如果找到匹配则不包含替换第三个文件中的值。我是shell脚本的新手,所以请给我单线命令或脚本来实现这一点。我愿意使用“sed”或任何其他shell脚本。
awk 'BEGIN{i=0}
FNR==NR { a[i++]=$1; next }
{ for(j=0;j<i;j++)
if(index($0,a[j]))
print $0
}' file2 file1
答案 0 :(得分:2)
file2是没用的。只需使用file1和file3:
$ awk 'NR==FNR{a[$0+0]=$0; next} {print ($0 in a ? a[$0] : $0)}' file3 file1
8841
00841
0526
000548
00547
88
98
答案 1 :(得分:1)
使用您的file1和file3,您可以执行以下操作:
$ cat file1
8841
841
526
548
547
88
98
$ cat file3
00841
0526
000548
00547
$ awk 'NR==FNR{x=$1;gsub(/^0+/,"",$1);a[$1]=x;next}($1 in a){print a[$1];next}1' file3 file1
8841
00841
0526
000548
00547
88
98
答案 2 :(得分:0)
您可以避免使用file3,并在awk中使用printf来使用前导零格式化输出。
使用awk
awk 'NR==FNR{a[$1 FS $2 FS $3 FS $4];next} {if ($2 FS $3 FS $4 FS $5 in a) printf "%s %05d %04d %06d %05d %s %s",$1,$2,$3,$4,$5,$6,$7}' file2 file1
8841 00841 0526 000548 00547 88 98