我有一个这样的清单:
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?
答案 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