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.


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.

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.


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, 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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.