it-swarm.com.de

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

Ich habe ein Verzeichnis mit mehreren .txt Dateien.

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

Ich habe es mit den Befehlen awk und sed versucht und mit einer Schleife kombiniert, aber ohne Erfolg.

12
Annemieke Smet

Verwenden Sie head:

head -n1 -q *.txt > new-file
  • -n1 weist head an, nur die erste Zeile zu extrahieren.
  • -q weist head an, den Dateinamen nicht zu drucken.
20
choroba

grep verwenden:

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

grep stimmt mit jedem Zeichen überein und wird nach der ersten Übereinstimmung beendet, d. H. grep gibt die ersten Zeilen aller Eingabedateien aus und wir speichern diese in out.txt.

8
heemayl

Verwenden Sie nur Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txt wird zu der Liste der Ordner/Dateien erweitert, die mit .txt im aktuellen Arbeitsverzeichnis enden (da es nur Ordner gibt, die mit .txt enden, ist dies kein Problem).
  • <"$f" read line liest eine Zeile aus dem in f gespeicherten Dateipfad und speichert sie in line;
  • printf "$line\n" >>new.txt: Hängt den Inhalt von line an new.txt an;
% 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
2
kos

Sie haben es mit awk versucht, hier ist eine awk Version

awk 'FNR==1 {print} {nextfile}' *.txt > out
0
A.B.

Ein anderer 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

sed ermöglicht auch das Drucken bestimmter Zeilen. Hier habe ich das mit find kombiniert

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 

Und zu guter Letzt 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.txt am Ende dieser Befehle anhängen.

0