从文件中获取模式,与另一个文件的列进行比较,并使用awk替换为第三个文件的列

时间:2014-01-28 02:46:06

标签: awk

我有三个文件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

3 个答案:

答案 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