AWK:在第一个文件中搜索第二个字符串

时间:2017-08-01 08:20:55

标签: bash shell awk

我有以下文件:

data.txt

Estring|0006|this_is_some_random_text|more_text
Fstring|0010|random_combination_of_characters
Fstring|0028|again_here

allids.txt(此处列以分号分隔;实际输入为制表符分隔

Estring|0006;MAR0593
Fstring|0002;MAR0592
Fstring|0028;MAR1195

请注意:data.txt:重要的部分是前两个“列”= name|number

现在我想使用awk搜索name|numberdata.txt的第一部分(allids.txt)并输出第二列(以MAR开头)

所以我的预期输出将是(再次以制表符分隔):

Estring|0006|this_is_some_random_text|more_text;MAR0593
Fstring|0010|random_combination_of_characters
Fstring|0028|again_here;MAR1195

我现在不知道如何搜索awk中的第一个保守部分,其余的应该是:

awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$1] = $1; next } $1 in a { print a[$0], [$1] }' data.txt allids.txt 

2 个答案:

答案 0 :(得分:2)

我会使用一组字段分隔符,如下所示:

awk -F'[|\t;]' 'NR==FNR{a[$1"|"$2]=$0; next}
                $1"|"$2 in a {print a[$1"|"$2]"\t"$NF}' data.txt allids.txt

实际数据示例中,您可以删除;。这里只是为了能够重现问题中的例子。

答案 1 :(得分:2)

这是另一个awk,它为两个文件使用不同的字段分隔符:

awk -F ';' 'NR==FNR{a[$1]=FS $2; next} {k=$1 FS $2} 
    k in a{$0=$0 a[k]} 1' allids.txt FS='|' data.txt

Estring|0006|this_is_some_random_text|more_text;MAR0593
Fstring|0010|random_combination_of_characters
Fstring|0028|again_here;MAR1195

此命令使用;作为allids.txt的FS,并使用|作为data.txt的FS。