5

У меня есть несколько файлов .txt (в том же каталоге), которые выглядят так:

   123 carrot
    50 apple
    13 tomato
     5 potato
     2 pear

а также

   100 carrot
    10 apple
     3 tomato
     2 potato

Мне нужно объединить их в один отсортированный список. Так что, если бы у меня было только два списка выше, я бы получил

   223 carrot
    60 apple
    16 tomato
     7 potato
     2 pear

Есть ли простой способ сделать это с помощью команд оболочки, или я должен начать писать код?

Спасибо!

1 ответ1

4

Где проходит граница между "командами оболочки" и "кодом"? Этот пример, возможно, выходит за рамки этой строки, но это просто функция быстрой агрегации в awk которую я уже написал для другой (более сложной) цели, так что я мог бы также опубликовать ее.

Предполагая, что файлы находятся в каталоге dir/ , awk может суммировать их следующим образом:

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

Сломать:

  • Проверьте каждую строку во всех файлах и добавьте значение первого поля к существующему значению индекса этого фрукта в массиве fruits (или создайте этот индекс, если он не существует).
  • Когда файлы пройдены, обведите все индексы в fruits и напечатайте их значение и имя в указанном формате.
  • Сортировка массива в awk возможна, но на глаз гораздо проще использовать sort . -rn сортирует численно в порядке убывания.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .