File1(包含数百万条记录的大文件)
1,5,404920012,TYPE1,INFO1
4,2,10000234,TYPE2,INFO2
2,3,40492001223,TYPE3,INFO3
3,1,50492001223,type4,info4
File2(只有10行的小文件)
40492 =产品1
10000 =产品2
输出
1,5,404920012,TYPE1,产品1,INFO1
4,2,10000234,TYPE2,产品2,INFO2
2,3,40492001223,TYPE3,产品1,INFO3
3,1,50492001223,type4,NOMATCH,info4
注意:
我想比较从file1到文件2的第3列的前5个字符
匹配字段后,product1应位于输出的第5列
我所尝试的内容:
虽然我是awk高级编程的新手,但到目前为止我学到了什么...我可以合并2个文件如下:
BEGIN {FS = OFS =“,”} FNR == NR { X = $ 1; $ 1 =“”; a [x] = $ 0; 下一个 }
{ if($ 3 in a)打印$ 0“,”a [$ 3]; 否则打印$ 0“,,”; }
但问题是..我不知道如何为第二个文件传递不同的FS(=第二个文件的情况下)以及如何组合substr函数echo 404920012 | awk'{print substr($ 0,1,5)}' 如果条件..
答案 0 :(得分:2)
这种情况,因为它在输入文件之间有所不同,您希望使用-F
或-v FS=
将aw设置为文件之间的适当值,而不是在awk命令参数中预先设置: / p>
awk '
NR==FNR { map[$1] = $2; next }
{
key = substr($3,1,5)
$5 = (key in map ? map[key] : "NOMATCH") OFS $5
print
}
' FS='=' File2 FS=',' OFS=',' File1
以防万一:这比您选择的答案更简洁,功能上它是等效的,所以请不要更改以选择此答案。
答案 1 :(得分:1)
尝试
awk -f p.awk file2 file1
其中p.awk
是
BEGIN{
FS=","
OFS=","
}
NR==FNR {
split($1,a,"=")
keys[a[1]]=a[2]
next
}
{
k=substr($3,1,5)
if (k in keys)
p=keys[k]
else
p="NOMATCH"
$4=$4 OFS p
print
}
带输出:
1,5,404920012,type1,product1,info1
4,2,10000234,type2,product2,info2
2,3,40492001223,type3,product1,info3
3,1,50492001223,type4,NOMATCH,info4