Wie extrahiere ich eine bestimmte Zeile in mehreren Textdateien in eine einzige TXT-Datei unter Linux?

2289
H. aryapour

Ich habe 5000 TXT-Dateien mit den verschiedenen Daten darunter. Ich brauche ein Shell-Skript, um nur Zeile 11 (letzte Zeile) von ihnen in eine einzige Datei zu kopieren und sie von kleinster zu größter zu sortieren.

zum Beispiel:

file1.txt

1KE5.pdb USER_CHARGES INVALID_CHARGES @<TRIPOS>ATOM ATOM 1 N MET A 1 40.880 54.110 11.190 1.00 0.00 ATOM 8 HB1 MET A 1 38.760 53.510 9.880 1.00 0.00 ATOM 9 HB2 MET A 1 39.700 52.020 9.980 1.00 0.00 1 40.7  

file2.txt

1KW5.pdb  USER_CHARGES  INVALID_CHARGES  @<TRIPOS>ATOM  ATOM 6 HA MET A 1 39.020 54.080 12.120 1.00 0.00 ATOM 7 CB MET A 1 39.050 52.700 10.580 1.00 0.00 ATOM 8 HB1 MET A 1 38.760 53.510 9.880 1.00 0.00 2 33.7  

file3.txt

1KW5.pdb  USER_CHARGES  INVALID_CHARGES  @<TRIPOS>ATOM  ATOM 4 H3 MET A 1 40.580 54.900 10.580 1.00 0.00 ATOM 5 CA MET A 1 39.750 53.360 11.780 1.00 0.00 ATOM 6 HA MET A 1 39.020 54.080 12.120 1.00 0.00 3 54.2  

Ich brauche die Ausgabe um:

Final.txt

1 40.7 2 33.7 3 54.2 

Ich brauche ein Skript, um dieses Problem zu lösen. Vielen Dank für jede Hilfe, die Sie geben können.

-1
Wenn die gewünschte Zeile immer die letzte ist, können Sie jede Datei mit 'tail -n 1 Dateiname >> output.txt' versehen. packen Sie es in einen Suchbefehl, der Ihre 5000 Dateien auswählen kann, und es sollte ziemlich einfach sein. Frank Thomas vor 7 Jahren 1
Bitte beachten Sie, dass [SU] kein Skriptschreibservice ist. Wenn Sie uns sagen, was Sie bisher versucht haben (einschließlich der von Ihnen verwendeten Skripts) und wo Sie stecken bleiben, können wir versuchen, bei bestimmten Problemen zu helfen. Sie sollten auch [Wie kann ich eine gute Frage stellen?] (Http://superuser.com/help/how-to-ask) lesen. DavidPostill vor 7 Jahren 2

3 Antworten auf die Frage

2
DKing

Je nachdem, was Sie für konsistenter halten, die 11. Zeile oder die letzte Zeile, können Sie entweder sedoder tailverwenden. Ich würde es vorziehen, sedda es mehrere Dateien sauberer handhabt und dafür sorgt, dass Dateien mit weniger Zeilen enthalten sind. Sie brauchen also nur eine Liste Ihrer Dateien. Dies kann mit Globbing geschehen, wenn sich alle im selben Verzeichnis befinden oder findwenn sie darunter verschachtelt sind.

Also mit findund sed:

find /path/to/your/files -type f -name '*.txt' -exec sed -n 11p {} + >> output.txt 

Das Gleiche gilt für tail, beachten Sie die Verwendung von \;anstatt, +damit jede Datei separat behandelt wird:

find /path/to/your/files -type f -name '*.txt' -exec tail -n1 {} \; >> output.txt 

Oder vielleicht ein Globing:

sed -n 11p /path/to/your/files/*.txt >> output.txt 
0
RedGrittyBrick

** Ich brauche ein Shell-Skript, um nur die letzte Zeile in eine einzige Datei zu kopieren und sie von kleinster zu größter zu sortieren.

Da Ihre Beispieldateien keine Zeile 11 haben, habe ich auf der Grundlage Ihres angegebenen "(letzte Zeile)" gearbeitet.

  • mehrere Textdateien mit einem gemeinsamen Benennungsmuster.
  • letzte Linie
  • Sortieren
  • in einer Datei ablegen

Die letzten Zeilen sammeln und sortieren

$ tail -q -n 1 file*.txt | sort 1 40.7 2 33.7 3 54.2 

und, um die Ergebnisse zu sortieren und die Ergebnisse in eine Datei zu schreiben

$ tail -q -n 1 file*.txt | sort > final.txt $ cat final.txt 1 40.7 2 33.7 3 54.2 

Dies setzt voraus, dass sich die Dateien alle in einem Verzeichnis befinden.

Wenn sich die Dateien in Unterverzeichnissen auf einer Ebene befinden, wechseln Sie file*.txtzu*/file*.txt

Wenn sich die Dateien in mehreren verschachtelten Verzeichnissen mit unterschiedlichen Tiefen oder an anderen Orten befinden, sollten Sie den findBefehl wie in anderen Antworten beschrieben verwenden.

$ find . -name 'file*.txt' -exec tail -q -n 1 {} \; | sort 1 40.7 2 33.7 3 54.2 

wo die Dateinamen Leerzeichen enthalten können, was früher ein Problem war.

$ ls -F *.txt file1.txt file2.txt file three.txt final.txt 
0
CiCC

Sie können verwenden find, um die Eingabedateien abzurufen, taildas Ende der Dateien zu ermitteln und sie sortzu sortieren. Zum Beispiel:

find /path/to/ -name "file*.txt" -type f -exec tail -n1 {} \; | sort --numeric-sort --output output.txt 

Wo /path/to/ist der Pfad zu Ihren Dateien, file*.txtist das Muster Ihrer Dateinamen, -type ffindet nur Dateien, keine Verzeichnisse, -n1fordert tail1 Zeile zurück und output.txtist die Ausgabedatei.

Vielen Dank für jede Hilfe, das funktioniert, aber die Werte beginnen in Spalte 7, mit Dezimalzahlen nach Zahlen (zB 1.000 2.000 3.0000) in der Ausgabedatei. Ich möchte Werte aus der ersten Spalte ohne Nullstellen schreiben. H. aryapour vor 7 Jahren 0