我首先要对特定列进行排序,我使用sort -k2 <file>
进行排序。然后,在使用第二列中的值对其进行排序后,我想添加第1列中的所有值,删除重复项,并保留第1列中的值。
示例:
2 AAAAAA
3 BBBBBB
1 AAAAAA
2 BBBBBB
1 CCCCCC
sort -k2 <file>
这样做:
2 AAAAAA
1 AAAAAA
3 BBBBBB
2 BBBBBB
1 CCCCCC
我知道uniq -c
将删除重复项并输出它发生了多少次,但是我不想知道它发生了多少次,我只需要添加和显示第1列。所以我会得到:
3 AAAAAA
5 BBBBBB
1 CCCCCC
答案 0 :(得分:1)
-c
是你的敌人。你明确要求计数。这是我的建议:
sort -k2 <file>| uniq -f1 file2
给了我
cat file2
1 AAAAAA
2 BBBBBB
1 CCCCCC
如果您只想在文件中添加第2列,请使用awk
sort -k2 <file>| uniq -f1 |awk '{print $2}' > file2
导致
AAAAAA
BBBBBB
CCCCCC
....但是如果你想在第1列中求和,那么只需使用awk
...当然你不能用uniq进行分组计数......
awk '{array[$2]+=$1} END { for (i in array) {print array[i], i}}' file |sort -k2
导致你的解决方案(即使我之后排序):
3 AAAAAA
5 BBBBBB
1 CCCCCC
答案 1 :(得分:1)
我想出了一个使用两个for循环的解决方案:
第一个循环遍历文件中的所有不同字符串(test.txt),对于每个字符串,我们找到原始文件中的所有数字,并在第二个循环中添加它们。添加完所有数字后,我们回显总数和字符串。
for chars in `sort -k2 test.txt | uniq -f 1 | cut -d' ' -f 2 `;
do
total=0;
for nr in `grep $a test.txt | cut -d' ' -f 1`;
do
total=$(($total+$nr));
done;
echo $total $chars
done