如何对一列进行排序并稍后添加值

时间:2016-04-15 11:29:35

标签: sorting unix

我首先要对特定列进行排序,我使用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

2 个答案:

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