合并排序列表

Ole*_*kin 5 linux unix sorting

我有几个 .txt 文件(在同一目录中),如下所示:

   123 carrot
    50 apple
    13 tomato
     5 potato
     2 pear
Run Code Online (Sandbox Code Playgroud)

   100 carrot
    10 apple
     3 tomato
     2 potato
Run Code Online (Sandbox Code Playgroud)

我需要将它们合并到一个排序列表中。所以如果我上面只有两个列表,我会得到

   223 carrot
    60 apple
    16 tomato
     7 potato
     2 pear
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用 shell 命令来做到这一点,还是应该开始编写代码?

谢谢!

Dan*_*son 4

“shell 命令”和“代码”之间的界限在哪里?这个示例可能超出了该范围,但它只是一个快速聚合函数,因为awk我已经为另一个(更详细的)目的编写了它,所以我不妨发布它。

假设文件位于目录中dir/awk可以将它们总结如下:

awk '
    {fruits[$2]+=$1}
    END { for (fruit in fruits) {printf "%6s %s\n", fruits[fruit], fruit} }
' dir/* | sort -rn
Run Code Online (Sandbox Code Playgroud)

分解:

  • 检查所有文件中的每一行,并将第一个字段的值添加到数组中该水果索引的现有值fruits(如果该索引不存在,则创建该索引)。
  • 遍历文件后,循环遍历索引fruits并以指定的格式打印它们的值和名称。
  • 数组排序awk是可能的,但是使用 . 看起来更容易sort-rn按数字降序排序。