【问题标题】: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 条件下..

【问题讨论】:

  • 我已经更新了我尝试过的内容以及我被困在查询下方的位置..

标签: awk


【解决方案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 循环:)
    猜你喜欢
    • 2012-01-17
    • 2019-05-04
    • 2020-12-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多