【问题标题】:Join File operation with awk [duplicate]使用 awk 加入文件操作 [重复]
【发布时间】:2017-04-15 17:58:37
【问题描述】:

我有一个包含 3600 万个数字的基本文件,其中 SERIALNOn 列没有,另一个文件的数据少于或等于 3600 万个,第一个常见的 SERIALNO 列比如基本文件和m列数,所有数据用逗号分隔。

我需要将基本文件第 1 列与文件第 1 列相匹配,并输出如序列号、列基本文件:1、..、基本文件:n、列文件:1、..、列文件:m 以及如果基本文件数据不可用在文件中,还需要捕获该值。

我也尝试过 join 命令和 grep 命令,但处理大文件的速度非常慢。任何机构都可以提出任何其他替代方案

我认为 awk 对于文件操作来说要快得多。

基础文件

serialno1,a,b,c,d
serialno2,a1,b2,c2,d2
serialno3,a3,b3,c3,d3

文件

serialno1,e,f,g,h
serialno2,e1,f2,g2,h2
serialno4,e4,f4,g4,h4

预期输出

serialno1,a,b,c,d,e,f,g,h
serialno2,a1,b2,c2,d2,e1,f2,g2,h2
serialno3,a3,b3,c3,d3,,,,,

【问题讨论】:

标签: arrays linux bash awk


【解决方案1】:

要从 file2 中删除非重复值,请使用:

awk -F ',' '{  if (NR==FNR){
                       r[$1]=$0
               }else{
                       if($1 in r){
                             r[$1]=r[$1]gensub($1,"",1)
                       }else{ 
                             r[$1]=r[$1] ",,,"
                       }
               }
             }END{
                       for(i in r){print r[i]}
             }' infile infile2  |
awk -F ',' 'a="";NF<8{a=",,,"}
            {printf("%s%s%s",$0,a,RS)}' 

注意| 字符,它将结果发送到第二个 awk 命令。

【讨论】:

  • 嗨,伙计,它可以工作,但有一个问题,比如我在输出中也得到了 serialno4、e4、f4、g4、h4,我不想要任何不在基本文件中的值。就像被遗漏的加入---> A-B+ AUB
  • 谢谢老兄,它工作得很好,我还需要你帮忙,文件 2 有固定的列号,比如 m。可以在输出中添加这么多的字段 serialno3,a3,b3,c3,d3,,,, 简单的逗号分隔或虚拟值
  • @ArunBinoy 请求已添加。
【解决方案2】:

你可以试试

awk 'BEGIN{FS=OFS=","}
    FNR==NR{d[$1]=substr($0,index($0,",")+1); next}
    {print $0, ($1 in d?d[$1]:",,,,")}' file base_file 

你明白了,

serialno1,a,b,c,d,e,f,g,h
serialno2,a1,b2,c2,d2,e1,f2,g2,h2
serialno3,a3,b3,c3,d3,,,,,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多