哇 |拆分列并使用子字符串映射
Posted
技术标签:
【中文标题】哇 |拆分列并使用子字符串映射【英文标题】:awk | split the column and map with substring 【发布时间】:2013-12-15 10:22:14 【问题描述】: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,product1,info1 4,2,10000234,type2,product2,info2 2,3,40492001223,type3,product1,info3 3,1,50492001223,type4,NOMATCH,info4
注意事项: 我想比较从文件 1 到文件 2 的第 3 列的前 5 个字符 匹配字段后,product1 应该在输出的第 5 列
我尝试过的: 虽然我是 awk 高级编程的新手,但到目前为止我学到的东西.. 我可以合并 2 个文件,如下所示:
开始 FS = OFS = "," FNR == NR x=$1; $1 = ""; a[x] = $0; 下一个 if($3 in a)print $0","a[$3]; 否则打印 $0",,";
但是这个问题是..我不知道如何为第二个文件传递不同的 FS(= 在第二个文件的情况下)以及如何组合 substr 函数 echo 404920012 | awk '打印 substr($0,1,5)' 在 if 条件下..
【问题讨论】:
我已经更新了我尝试过的内容以及我被困在查询下方的位置.. 【参考方案1】:在这种情况下,由于输入文件之间存在差异,因此您希望将 FS 设置为文件之间的适当值,而不是使用 -F
或 -v FS=
在 awk 命令参数中预先设置:
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
以防万一:这只是比您选择的答案更简短,在功能上它是等效的,所以请不要更改为选择这个。
【讨论】:
【参考方案2】:试试
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
【讨论】:
谢谢 Håkon .. 这真的很有帮助.. 但是有没有可能在指定 print $1,$2,$3,$4,p,$5.. 我也可以指定范围?例如,如果我的文件有 100 个字段.. 所以我们不写单个列名,而是写 $1-$4,p,$5-$100..? 你也可以解释一下 - keys[a[1]]=a[2] 谢谢..如果文件真的很大,不确定循环会有多昂贵..在这种情况下,它将为每一列循环每一行..但无论如何..我得到了真正有意义的答案..谢谢 @VipinChoudharykeys[a[1]]=a[2]
根据split
函数的结果构建关联数组keys
..
@VipinChoudhary 我找到了更好的解决方案,请参阅更新。现在您根本不必使用for
循环:)以上是关于哇 |拆分列并使用子字符串映射的主要内容,如果未能解决你的问题,请参考以下文章