我有以下两个文件(实际数据是制表符分隔而不是分号):
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字符串,由空格分隔。真实例子中的字符串比短摘录中的字符串多得多。
答案 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,因此速度很慢。您可以通过break
向if
delete
和a
匹配条目添加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