【问题标题】:Listing elements awk列出元素 awk
【发布时间】:2011-12-07 17:41:57
【问题描述】:

我有一个这样的列表:

s1   d2
s1   d4
s3   d2
s4   d1
s1   d3 
s4   d1
s5   d6
s3   d5
s1   d2
s1   d3

对于第一列 (s_) 中的每个元素,我需要以相同的出现顺序获取第二列 (d_) 中的元素列表。在这种情况下:

s1  d2 d4 d3 d2 d3
s3  d2 d5
s4  d1 d1    
s5  d6 

s_ 的顺序不重要,d_ 的顺序很重要。 您能否建议一种简单而快速的方法(因为列表很大),也许在 awk 中?

【问题讨论】:

    标签: list shell multidimensional-array awk


    【解决方案1】:

    可能是这样的(对于命令行):

    awk '{ vals[$1] = vals[$1] " " $2 }; END { for (key in vals) { print key,vals[key] }}' list
    

    格式化为更漂亮的 awk 脚本:

    { vals[$1] = vals[$1] " " $2 }
    END {
        for (key in vals) {
            print key,vals[key]
        }
    }
    

    它的作用是通过第一个值的索引存储一个包含右侧渐进值的字符串。因此,每次找到一个时,它都会将其连接到该字符串的末尾。然后在最后打印出每一对。

    【讨论】:

    • 这正是我所需要的,而且非常简单。
    【解决方案2】:

    我会使用关联数组来记住“sX”,然后对值进行字符串连接。

    BEGIN {
    print "ID\tList\n";
    }
    {
    id[$1]=id[$1] $2;
    }
    END{
    for (var in id)
        print var,"\t",id[var];
    }
    

    【讨论】:

      【解决方案3】:

      给你:

       awk '{ ss[$1]++ ; ds[$1 NR]=$2 } 
            END { for ( e in ss ) 
                      { a=e 
                        for (i=1;i<=NR;i++) 
                            { a=a " " ds[e i] }  
                        printf("%s\n",gensub("  +"," ","g",a))
                      }
            }' INPUTFILE
      

      HTH

      【讨论】:

        【解决方案4】:

        这将保证键和值的顺序:

        awk 'END {
          for (i = 0; ++i <= c;)
            print idx[i], s[idx[i]]
          }
        {
          s[$1] = s[$1] ? s[$1] OFS $2 : $2
          t[$1]++ || idx[++c] = $1
          }' infile
        

        【讨论】:

          猜你喜欢
          • 2014-03-04
          • 2021-02-23
          • 2017-09-06
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          相关资源
          最近更新 更多