Hinzufügen der Größe aller Dateien mit demselben Namen in UNIX-Shell-Skripten

0

Ich bin neu hier und möchte fragen, wie man Dateigrößen mit dem gleichen Namen hinzufügt. Meine Dateinamen unterscheiden sich tatsächlich voneinander, aber ich habe sie ausgeschnitten, damit ich Dateien erhalten kann, die in Gruppen zusammengefasst sind.

Hier sind meine Originaldateien mit Größen (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 aus, um diese Zeichen ab '_' (Unterstrich) zu entfernen. Sie werden so:

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

Jetzt möchte ich die Größe aller Dateien mit demselben Dateinamen wie oben hinzufügen. Die Ausgabe sollte folgendermaßen aussehen:

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

Bitte helfen Sie. Vielen Dank, Jungs. Ich stecke jetzt schon seit Stunden hier fest

Null Darbelll
quelle
Ich bin nicht sicher, ob Zeilennummern in vorhanden sind sample.txtund Sie sie in der Ausgabe möchten. Es sieht aus wie eine nummerierte Liste, also vielleicht auch nicht. Bitte fügen Sie Ihre Datei und die gewünschte Ausgabe ein code sample, um Verwirrung zu vermeiden.
Kamil Maciorowski
Wow Kamil, es hat funktioniert! Können Sie mir bitte den Code erklären? Besonders der awk Befehl. Ich bin damit nicht vertraut. Ich danke dir sehr!
Zero Darbelll

Antworten:

0

Vorausgesetzt, 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}'

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


EDIT1 - Erläuterung wie gewünscht:

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

Dann findet der awkBefehl in jeder Zeile zwei Felder. Wir nennen sie Größe und Name , awkbezeichnen sie aber als $1und $2intern. Für jede Zeile wird ein Element eines Arrays erhöht a(der Name awird willkürlich gewählt und hat nichts mit dem Dateinamen im Beispiel zu tun). Der Name gibt an $2 , welches Element erhöht werden soll - es ist ein Index. Die Größe $1 ist der Inkrementierungswert. awkist schlau genug, um aElemente zu initialisieren , 0wie es zum ersten Mal erwähnt wird. Das jeweilige Element wird jedes Mal inkrementiert, wenn sein Index ( Name ) als zweites Feld in der Eingabezeile erscheint. Am Ende (nach der letzten Zeile der Eingabe)awkDurchläuft jeden bekannten Index von aund gibt den Wert (der jetzt kumulative Größe ist ) und einen Index ( Name ) aus.

Kamil Maciorowski
quelle
Wow Kamil, es hat funktioniert! Können Sie mir bitte den Code erklären? Besonders der awk Befehl. Ich bin damit nicht vertraut. Ich danke dir sehr!
Null Darbelll
0

So erhalten Sie die Summe aller Dateien, die mit "" beginnen a_ :

du -c a_*  | grep total

duBerechnet die Größe aller Dateien und -csummiert die Größen. Das grep extrahiert nur die Gesamtsumme und nicht alle einzelnen Dateien.

Paul
quelle
Danke Paul, aber es funktioniert nicht. Ich möchte nur klarstellen, dass sich diese beiden Dateigruppen in .txt befinden. Ich werde meine Frage erneut bearbeiten. Sorry
Zero Darbelll