So wählen Sie die erste Zeile aus jeder Datei in einem Verzeichnis aus und drucken sie in eine neue Textdatei

13

Ich habe ein Verzeichnis mit mehreren .txtDateien.

Aus jeder dieser Dateien möchte ich die erste Zeile auswählen und in eine neue .txtDatei drucken (um eine Liste aller ersten Zeilen zu erhalten).

Ich versuchte es mit dem awkund sedBefehlen und kombinierte sie mit einer Schleife, aber ohne Erfolg.

Annemieke Smet
quelle
1
Als Benutzer von Reputation 6: Wenn Ihnen eine der unten stehenden Antworten weitergeholfen hat, vergessen Sie nicht, auf das graue links neben dem Text zu klicken. Dies bedeutet, dass Ja, diese Antwort gültig ist ! ;-)
Fabby

Antworten:

21

Verwendung head:

head -n1 -q *.txt > new-file
  • -n1 erzählt head nur die erste Zeile zu extrahieren.
  • -q weist head an, den Dateinamen nicht zu drucken.
Choroba
quelle
8

Verwenden von grep:

grep -m 1 '.' *.txt >output.file

grepStimmt mit jedem Zeichen überein und wird nach der ersten Übereinstimmung beendet, dh es grepwerden die ersten Zeilen aller Eingabedateien ausgegeben und diese werden in gespeichert out.txt.

heemayl
quelle
1
Ich mag das, es ist ein netter kleiner Hack.
Hashim
2

Verwenden Sie nur Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtwird auf die Liste der Ordner / Dateien, die mit enden, .txtim aktuellen Arbeitsverzeichnis erweitert (da es nur Dateien gibt, deren Ordner mit enden).txt kein Problem darstellen);
  • <"$f" read lineLiest eine Zeile aus dem in gespeicherten Dateipfad fund speichert sie in line;
  • printf "$line\n" >>new.txt: fügt den Inhalt von linean new.txt;
% cat foo.txt 
line #1 in foo
line #2 in foo
line #3 in foo

% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar

% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done

% cat new.txt 
line #1 in bar
line #1 in foo
kos
quelle
kos, ein bisschen lang, aber hier ist +1 ..
heemayl
@heemayl Aber es ist nur Bash. ;)
Kos
1
Übrigens Glückwunsch zu 15k :)
heemayl
1
@heemayl Danke: D. Ehrlich gesagt schaue ich mir die Seite wie verrückt an, nur um eine Frage zu schützen. XD
kos
0

Du hast es mit probiert awk, hier ist eine awkVersion

awk 'FNR==1 {print} {nextfile}' *.txt > out
AB
quelle
0

Ein weiterer Ansatz bei AWK besteht darin, AWK anzuweisen, zu drucken, und dann sofort zur nächsten Datei zu wechseln

tmp:$ touch file1 file2 file3

tmp:$ printf  "Line 1 \n Line 2" | tee file1 file2 file3
Line 1 
 Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1 
Line 1 
Line 1

sedErmöglicht auch das Drucken bestimmter Zeilen. Hier habe ich das mit kombiniertfind

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

Und perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

Zuguterletzt , grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

Wenn Sie alles in einer einzelnen Datei speichern möchten, müssen Sie nur > outputFile.txtdie folgenden Befehle anhängen .

Sergiy Kolodyazhnyy
quelle