列出元素awk

时间:2011-12-07 17:41:57

标签: list shell multidimensional-array awk

我有一个这样的清单:

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?

4 个答案:

答案 0 :(得分:5)

这样的事情,也许(对于命令行):

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]
    }
}

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你走了:

 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

答案 3 :(得分:1)

这将保证键和值的顺序:

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