Как добавить размеры всех файлов с одинаковым именем в скриптах UNIX Shell

Как добавить размеры всех файлов с одинаковым именем в скриптах UNIX Shell

Я новичок здесь и хочу спросить, как добавить размеры файлов с одинаковым именем? Мои имена файлов на самом деле отличаются друг от друга, но я их обрезал, чтобы получить файлы, сгруппированные вместе.

вот мои оригинальные файлы с размерами (пример)

В файле sample.txt содержатся следующие данные:

  1. 12345 а_1.txt
  2. 12234 b_1.txt
  3. 32123 c_1.txt
  4. 11122 а_2.txt

Теперь я обрезаю имена файлов внутри sample.txt, чтобы удалить эти символы, начинающиеся с '_' (подчеркивание). Они становятся такими:

  1. 12345 а
  2. 12234 б
  3. 32123 с
  4. 11122 а

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

  1. 23467 а
  2. 12234 б
  3. 32123 с

Помогите, пожалуйста. Большое спасибо, ребята. Я застрял здесь на несколько часов.

решение1

sample.txtПредположим, что в : нет номеров строк .

cut -f 1 -d _ sample.txt | awk '{a[$2] += $1} END{for (i in a) print a[i], i}'

Вы можете добавить | sort -k 2в конце.


EDIT1 - пояснение по запросу:

Команда cutвырезает каждую строку с _разделителем и сохраняет только первую часть. Вы уже сделали это с вашим исходным файлом.

Затем awkкоманда находит два поля в каждой строке. Мы называем ихразмериимя, но awkссылается на них как на $1и $2внутри. Для каждой строки он увеличивает один элемент массива a(имя aвыбирается произвольно и не имеет ничего общего с именем файла в образце).имя $2сообщает, какой элемент увеличивать — это индекс;размер $1является значением приращения. awkдостаточно умен, чтобы инициализировать aэлемент, 0как упоминается в первый раз. Конкретный элемент увеличивается каждый раз, когда его индекс (имя) появляется как второе поле входной строки. В конце (после последней строки ввода) awkпроходит по всем известным индексам aи печатает значение (которое теперьсовокупный размер) и индекс (имя).

решение2

Чтобы получить общее количество файлов, начиная с a_ you, можно сделать следующее:

du -c a_*  | grep total

duвычисляет размер всех файлов, а затем -cсуммирует размеры. Grep просто извлекает общую сумму, а не все отдельные файлы.

Связанный контент