是否可以将其转变:
1 Alice
1 Bob
1 Cary
2 Dan
3 Eve
3 Fred
变成这样:
1 Alice,Bob,Cary
2 Dan
3 Eve,Fred
使用 shell?(不使用 Perl、Ruby、Python 等)
答案1
答案2
在 bash 版本 4 中使用关联数组:
declare -A ary
while read line; do
set -- $line
ary[$1]+="$2,"
done < input_file
for key in ${!ary[@]}; do
printf "%s %s\n" $key ${ary[$key]%,} # the "%," strips the trailing comma
done
答案3
糟糕,我没法抗拒这个挑战。下面是我在 shell(确切地说是 bash)中的解决方案,一行代码:
k=0; while read i j; do if [ $k -eq $i ]; then echo -n ",$j"; \
else [ $k -gt 0 ] && echo; echo -n "$i $j"; k=$i; fi; done \
</tmp/infile; echo
生成所需的输出,格式正确:
1 Alice,Bob,Cary
2 Dan
3 Eve,Fred
假设:
- 0 不是数据第一列中的有效条目。
- 第一列已经按数字排序。
如果 #2 无效,您需要sort(1)
先对输入进行数字排序,以将其置于正确的顺序。
如果我发现我刚刚回答了你的家庭作业,我会非常生气。我唯一的安慰是,如果你的老师看到我写的东西,他们会认为你疯了。
答案4
stackoverflow 上的这个问题非常相似,并且有一些很好的答案: https://stackoverflow.com/questions/380817/best-way-to-simulate-group-by-from-bash