【问题标题】: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