awk匹配2个文件中的子串

时间:2017-08-24 17:16:36

标签: bash awk

我有以下两个文件(实际数据是制表符分隔而不是分号): input.txt

Astring|2042;MAR0303;foo1;B
Dstring|2929;MAR0283;foo2;C

db.txt 已更新

TG9284;Astring|2042|morefoohere_foo_foo
TG9281;Cstring|2742|foofoofoofoofoo Dstring|2929|foofoofoo

因此,input.txt的column1是db.txt的column2的子字符串。只有两个"字段"在此处以|分隔非常重要。

我想使用awk匹配这两列并打印以下内容(再次以制表符分隔的形式):

Astring|2042;MAR0303;foo1;B;TG9284
Dstring|2929;MAR0283;foo2;C;TG9281

这是我的代码:

awk -F'[\t]' 'NR==FNR{a[$1]=$1}$1 in a {print $0"\t"$1}' input.txt db.txt

修改 db.txt的column2包含{1}的column1字符串,由空格分隔。真实例子中的字符串比短摘录中的字符串多得多。

3 个答案:

答案 0 :(得分:2)

您可以使用此awk 'BEGIN{FS=OFS="\t"} NR==FNR{ split($2, b, "|"); a[b[1] "|" b[2]]=$1; next} $1 in a {print $0, a[$1]}' db.txt input.txt Astring|2042 MAR0303 foo1 B TG9284 Dstring|2929 MAR0283 foo2 C TG9281

awk 'BEGIN{FS=OFS="\t"} NR==FNR {
  a[$2]=$1; next} {for (i in a) if (index(i, $1)) print $0, a[i]}' db.txt input.txt

Astring|2042    MAR0303 foo1    B   TG9284
Dstring|2929    MAR0283 foo2    C   TG9281

修改

根据您的评论,您可以使用:

SKPaymentQueue.default().add()

答案 1 :(得分:0)

使用分号,您可以使用选项卡替换:

$ awk -F\; '
NR==FNR {                     # hash the db file
    a[$2]=$1
    next
}
{
    for(i in a)               # for each record in input file
       if($1~i) {             # see if $1 matches a key in a
           print $0 ";" a[i]  # output
           # delete a[i]      # delete entry from a for speed (if possible?)
           break              # on match, break from for loop for speed
       }
}' db input                   # order order
Astring|2042;MAR0303;foo1;B;TG9284
Dstring|2929;MAR0283;foo2;C;TG9281

input脚本中的每条记录与db中的每个条目匹配$ 1,因此速度很慢。您可以通过breakif deletea匹配条目添加awk来加快速度(如果您的数据允许)。

答案 2 :(得分:0)

请您试试,请告诉我这是否对您有所帮助。它将查找从input.txt到db.txt文件的$ 1的完全匹配。

awk -F";" 'FNR==NR{a[$1]=$0;next} {for(i in a){match($0,i);if(substr($0,RSTART,RLENGTH)){print a[i]";"$1}}}' input.txt  db.txt