J'ai plusieurs fichiers quelque chose comme: (en réalité, j'en ai 80)
file1.dat
2 5
6 9
7 1
file2.dat
3 7
8 4
1 3
Je veux me retrouver avec un fichier contenant toutes les secondes lignes. c'est à dire
output.dat
6 9
8 4
Ce que j'ai jusqu'ici fait une boucle sur les noms de fichiers mais écrase ensuite le fichier avant lui. par exemple, la sortie des fichiers ci-dessus serait juste
8 4
mon script shell ressemble à ceci:
post.sh
TEND = 80
TINDX = 0
while [ $TINDX - lt $TEND]; do
awk '{ print NR==2 "input-$TINDX.dat > output.dat
TINDX = $((TINDX+1))
done
awk 'FNR==2' file{1..80}.dat > output.dat
Et
head -n 2 input.dat | tail -n 1 | awk
...la source
head
/tail
est définitivement une option, vous n'avez pas besoinawk
alors.sed
serait suffisant:-s
l'option est nécessaire pour imprimer la 2e ligne de chaque fichier, sinon seule la 2e ligne du premier fichier sera imprimée.la source
La
sed
solution d'Aragaer est la plus agréable, oui. Mais depuis que j'apprécie un peu lahead|tail
découpe, j'ai unehead|tail
solution qui prend en charge plusieurs fichiers, pas seulement un seulinput.dat
. L'utilisation d'une boucle for, au lieu de transmettre une liste de fichiers à sed, facilite également d'autres tâches avec le fichier avant / après l'extraction de la deuxième ligne avec sed.Version multi-lignes abondamment commentée:
NB: le code ci-dessous s'exécutera. Nous sommes libres de mettre un saut de ligne après
|
,&&
ou||
, et continuer notre commande sur la ligne suivante; nous pouvons même mettre des commentaires entre les deux. J'ai passé des années à ne pas le savoir (et à ne le voir vraiment nulle part). Ce style est moins utile à l'invite interactive, mais nettoie les fichiers de script sans fin.la source
Il y a évidemment beaucoup de façons de le faire - je pense que j'aime mieux la réponse sed de @ aragaer .
En voici un qui utilise uniquement des commandes internes bash et n'a pas besoin de bifurquer d'utilitaires externes:
la source
Pour une utilisation efficace de
awk
etsed
dans les réponses ici sur plusieurs fichiers, mieux vaut utiliser l'nextfile
instruction pour ignorer le traitement des lignes indésirables dansawk
.et avec
sed
, nous pouvons quitter lors du traitement sur la 3 ème ligne etsed
traiter le fichier suivant.la source