Jak dodać rozmiary wszystkich plików o tej samej nazwie w skryptach powłoki UNIX

0

Jestem tutaj nowy i chcę zapytać, jak dodać rozmiary plików o tej samej nazwie? Nazwy plików różnią się od siebie, ale wycinam je, aby móc zgrupować pliki.

oto moje oryginalne pliki z rozmiarami (przykład)

sample.txt zawiera te dane:

  1. 12345 a_1.txt
  2. 12234 b_1.txt
  3. 32123 c_1.txt
  4. 11122 a_2.txt

Teraz wycinam nazwy plików wewnątrz sample.txt, aby usunąć te znaki zaczynające się od '_' (podkreślenie). Stają się tacy:

  1. 12345 a
  2. 12234 b
  3. 32123 c
  4. 11122 a

Teraz chcę dodać rozmiary wszystkich plików o tej samej nazwie, jak pokazano powyżej. Dane wyjściowe powinny wyglądać następująco:

  1. 23467 a
  2. 12234 b
  3. 32123 c

Proszę pomóż. Wielkie dzięki. Utknąłem tu już od wielu godzin

Zero Darbelll
źródło
Nie jestem pewien, czy istnieją numery linii sample.txt i chcesz je na wyjściu. Wygląda jak lista numerowana, więc może nie. Proszę wkleić plik i żądane wyjście jako code sample aby uniknąć nieporozumień.
Kamil Maciorowski
Wow Kamil, to zadziałało! Czy możesz mi wyjaśnić kod? Zwłaszcza komenda awk. Nie znam go. Dziękuję bardzo!
Zero Darbelll

Odpowiedzi:

0

Zakładając, że nie ma numerów linii sample.txt:

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

Możesz dodać | sort -k 2 na końcu.


EDIT1 - wyjaśnienie na żądanie:

The cut polecenie przecina każdą linię _ ogranicznik i zapisuje tylko pierwszą część. Zrobiłeś to już z oryginalnym plikiem.

A później awk polecenie znajduje dwa pola w każdej linii. Nazywamy ich rozmiar i imię , ale awk odnosi się do nich jako $1 i $2 wewnętrznie. Dla każdej linii zwiększa jeden element tablicy a (imię a jest dowolnie wybrany i nie ma nic wspólnego z nazwą pliku w próbce). The imię $2 informuje, który element ma być zwiększany - jest to indeks; rozmiar $1 jest wartością przyrostową. awk jest wystarczająco inteligentny, aby zainicjować a element z 0 jak wspomniano po raz pierwszy. Dany element jest zwiększany za każdym razem, gdy jego indeks ( imię ) pojawia się jako drugie pole linii wejściowej. Na końcu (po ostatniej linii wejścia) awk przechodzi przez każdy znany indeks a i wypisuje wartość (która jest teraz łączny rozmiar ) i indeks ( imię ).

Kamil Maciorowski
źródło
Wow Kamil, to zadziałało! Czy możesz mi wyjaśnić kod? Zwłaszcza komenda awk. Nie znam go. Dziękuję bardzo!
Zero Darbelll
0

Aby uzyskać sumę każdego pliku zaczynającego się od a_ możesz to zrobić:

du -c a_*  | grep total

du oblicza wtedy rozmiar wszystkich plików -c sumuje rozmiary. Grep po prostu wyodrębnia całość, a nie wszystkie pojedyncze pliki.

Paul
źródło
Dziękuję Paul, ale to nie działa. Chcę tylko wyjaśnić, że te 2 pliki są w formacie .txt. Ponownie edytuję moje pytanie. Przepraszam
Zero Darbelll