Come selezionare la prima riga da ciascun file in una directory e stamparla in un nuovo file di testo


13

Ho una directory con diversi .txtfile.

Da ciascuno di questi file, voglio selezionare la prima riga e stamparla in un nuovo .txtfile (per ottenere un elenco di tutte le prime righe).

Ho provato con la awke sedcomandi e combinato con un ciclo, ma senza successo.


1
Dato che sei un utente di reputazione 6: se una delle risposte qui sotto ti ha aiutato, non dimenticare di fare clic sul grigio a sinistra del suo testo, il che significa Sì, questa risposta è valida ! ;-)
Fabby,

Risposte:


21

Utilizzare head:

head -n1 -q *.txt > new-file
  • -n1dice headdi estrarre solo la prima riga.
  • -q dice a head di non stampare il nome del file.

9

Utilizzando grep:

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

grepcorrisponderà a qualsiasi carattere e uscirà dopo la prima corrispondenza, ovvero grepprodurrà le prime righe di tutti i file di input e li stiamo salvando out.txt.


1
Mi piace, è un bel trucco.
Hashim,

2

Utilizzando solo Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtviene espanso all'elenco di cartelle / file che terminano con .txtnella directory di lavoro corrente (poiché ci sono solo file che terminano con .txtnon sono un problema);
  • <"$f" read linelegge una riga dal percorso del file archiviato fe lo memorizza line;
  • printf "$line\n" >>new.txt: aggiunge il contenuto di linea 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, un po 'lungo ma qui è +1 ..
heemayl

@heemayl Ma è solo Bash. ;)
kos,

1
BTW si congratula con 15k :)
heemayl

1
@heemayl Grazie: D. Onestamente sto visitando il sito come un matto solo per il gusto di proteggere una domanda XD
kos

0

Ci hai provato awk, ecco una awkversione

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

0

Un altro approccio con AWK è dire ad AWK di stampare, ma poi passare immediatamente al file successivo

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

sedconsente anche la stampa di linee specifiche. Qui l'ho combinato confind

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

E perl:

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

Ultimo ma non meno importante , grep

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

Il salvataggio di tutto in un singolo file è solo una questione di aggiunta > outputFile.txtalla fine di questi comandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.