使用 shell 分组记录

使用 shell 分组记录

是否可以将其转变:

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

是的,有几种方法可以做到这一点。

Sort是你的朋友:排序 Wiki

原样AwkAwk 操作指南

答案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

假设:

  1. 0 不是数据第一列中的有效条目。
  2. 第一列已经按数字排序。

如果 #2 无效,您需要sort(1)先对输入进行数字排序,以将其置于正确的顺序。

如果我发现我刚刚回答了你的家庭作业,我会非常生气。我唯一的安慰是,如果你的老师看到我写的东西,他们会认为你疯了。

答案4

stackoverflow 上的这个问题非常相似,并且有一些很好的答案: https://stackoverflow.com/questions/380817/best-way-to-simulate-group-by-from-bash

相关内容