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.
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.Utilisation de grep
name__:
grep -m 1 '.' *.txt >output.file
grep
correspondra à n’importe quel caractère et quittera après la première correspondance. grep
affichera les premières lignes de tous les fichiers d’entrée et nous les sauvegardons dans out.txt
.
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
Vous avez essayé avec awk
, voici une version awk
awk 'FNR==1 {print} {nextfile}' *.txt > out
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.