So addieren Sie die Größe aller Dateien mit demselben Namen in UNIX-Shell-Skripten

So addieren Sie die Größe aller Dateien mit demselben Namen in UNIX-Shell-Skripten

Ich bin neu hier und möchte fragen, wie ich die Größe von Dateien mit demselben Namen addieren kann. Meine Dateinamen unterscheiden sich eigentlich voneinander, aber ich habe sie gekürzt, damit ich gruppierte Dateien erhalten konnte.

hier sind meine Originaldateien mit Größenangaben (Beispiel)

sample.txt enthält diese Daten:

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

Jetzt schneide ich die Dateinamen in sample.txt ab, um die Zeichen zu entfernen, die mit '_' (Unterstrich) beginnen. Sie sehen dann so aus:

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

Jetzt möchte ich die Größen aller Dateien mit demselben Dateinamen wie oben gezeigt addieren. Die Ausgabe sollte wie folgt aussehen:

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

Bitte helft mir. Vielen Dank, Leute. Ich stecke jetzt schon seit Stunden hier fest.

Antwort1

Angenommen, es gibt keine Zeilennummern in sample.txt:

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

| sort -k 2Möglicherweise möchten Sie es am Ende hinzufügen .


EDIT1 - Erklärung wie gewünscht:

Der cutBefehl schneidet jede Zeile mit _Trennzeichen ab und speichert nur den ersten Teil. Das haben Sie bereits mit Ihrer Originaldatei getan.

Dann awkfindet der Befehl in jeder Zeile zwei Felder. Wir nennen sieGrößeUndName, sondern awkbezeichnet sie intern als $1und $2. Für jede Zeile wird ein Element eines Arrays erhöht a(der Name aist willkürlich gewählt und hat nichts mit dem Dateinamen im Beispiel zu tun). DieName $2gibt an, welches Element erhöht werden soll - es ist ein Index; dasGröße $1ist der Inkrementierungswert. awkist intelligent genug, um adas Element mit zu initialisieren 0, wie es zum ersten Mal erwähnt wird. Das jeweilige Element wird jedes Mal inkrementiert, wenn sein Index (Name) erscheint als zweites Feld der Eingabezeile. Am Ende (nach der letzten Zeile der Eingabe) awkdurchläuft jeden bekannten Index von aund druckt den Wert aus (der jetztkumulative Größe) und einen Index (Name).

Antwort2

Um die Summe aller Dateien zu erhalten, die mit „Sie“ beginnen, a_ können Sie Folgendes tun:

du -c a_*  | grep total

duberechnet die Größe aller Dateien und -caddiert dann die Größen. Der grep extrahiert nur die Gesamtsumme und nicht alle einzelnen Dateien.

verwandte Informationen