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

13

J'ai un répertoire avec plusieurs .txtfichiers.

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

Je l'ai essayé avec les commandes et awket l'ai sedcombiné avec une boucle, mais sans succès.

Annemieke Smet
la source
1
Comme vous êtes un utilisateur de réputation 6: Si l'une des réponses ci-dessous vous a aidé, n'oubliez pas de cliquer sur le gris à gauche de son texte, ce qui signifie que oui, cette réponse est valide ! ;-)
Fabby

Réponses:

21

Utilisation head:

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

En utilisant grep:

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

grepcorrespondra à n'importe quel caractère et quittera après la première correspondance, c'est-à grep- dire affichera les premières lignes de tous les fichiers d'entrée et nous les enregistrons out.txt.

heemayl
la source
1
J'aime ça, c'est un joli petit hack.
Hashim
2

En utilisant uniquement Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtest étendu à la liste des dossiers / fichiers se terminant par .txtdans le répertoire de travail en cours (car il n'y a que les dossiers dont les dossiers se terminant par .txtne sont pas un problème);
  • <"$f" read linelit une ligne du chemin de fichier stocké dans fet le 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
kos
la source
kos, un peu long mais voici +1 ..
heemayl
@heemayl Mais c'est uniquement Bash. ;)
kos
1
BTW bravo pour 15k :)
heemayl
1
@heemayl Merci: D. Honnêtement, je vérifie le site comme un fou juste pour protéger une question XD
kos
0

Vous l'avez essayé avec awk, voici une awkversion

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

Une autre approche avec AWK consiste à dire à AWK d'imprimer, mais 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

sedpermet également l'impression de lignes spécifiques. Ici, je l'ai combiné avecfind

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 pour couronner le tout , 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 est simplement une question d'ajout > outputFile.txtà la fin de ces commandes.

Sergiy Kolodyazhnyy
la source