web-dev-qa-db-fra.com

Comment sélectionner la première ligne de chaque fichier d'un répertoire et l'imprimer dans un nouveau fichier texte

J'ai un répertoire avec plusieurs fichiers .txt.

Dans chacun de ces fichiers, je souhaite sélectionner la première ligne et l'imprimer dans un nouveau fichier .txt (pour obtenir une liste de toutes les premières lignes).

Je l'ai essayé avec les commandes awk et sed et l'ai combiné avec une boucle, mais sans succès.

12
Annemieke Smet

Utilisez head:

head -n1 -q *.txt > new-file
  • -n1 indique à head d'extraire uniquement la première ligne.
  • -q indique à la tête de ne pas imprimer le nom de fichier.
20
choroba

Utilisation de grepname__:

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

grepcorrespondra à n’importe quel caractère et quittera après la première correspondance. grepaffichera les premières lignes de tous les fichiers d’entrée et nous les sauvegardons dans out.txt.

8
heemayl

En utilisant uniquement Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txt est étendu à la liste des dossiers/fichiers se terminant par .txt dans le répertoire de travail en cours (car seuls les dossiers de fichiers se terminant par .txt ne sont pas préoccupants);
  • <"$f" read line lit une ligne du chemin de fichier stocké dans f et la stocke dans line;
  • printf "$line\n" >>new.txt: ajoute le contenu de line à 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
2
kos

Vous avez essayé avec awk, voici une version awk

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

Une autre approche avec AWK consiste à indiquer à AWK d’imprimer, puis de passer immédiatement au fichier suivant.

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 permet également l'impression de lignes spécifiques. Ici, j'ai combiné cela avec find

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

Et Perl:

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

Et last but not least, grep

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

Tout enregistrer dans un seul fichier consiste simplement à ajouter > outputFile.txt à la fin de ces commandes.

0