哇 |拆分列并使用子字符串映射

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] 谢谢..如果文件真的很大,不确定循环会有多昂贵..在这种情况下,它将为每一列循环每一行..但无论如何..我得到了真正有意义的答案..谢谢 @VipinChoudhary keys[a[1]]=a[2] 根据split 函数的结果构建关联数组keys.. @VipinChoudhary 我找到了更好的解决方案,请参阅更新。现在您根本不必使用for 循环:)

以上是关于哇 |拆分列并使用子字符串映射的主要内容,如果未能解决你的问题,请参考以下文章

C#将文本拆分为子字符串

BigQuery拆分列并获取每个子字符串的计数[重复]

C ++在多个子字符串上拆分字符串

在子字符串中拆分 NSString [重复]

通过python将一个大字符串拆分为包含'n'个单词的多个子字符串

将输入框条目的字符串拆分为单词的子字符串