Tengo varios archivos como: (en realidad tengo 80)
file1.dat
2 5
6 9
7 1
file2.dat
3 7
8 4
1 3
Quiero terminar con un archivo que contiene todas las segundas líneas. es decir
output.dat
6 9
8 4
Lo que tengo hasta ahora recorre los nombres de los archivos, pero luego sobrescribe el archivo antes. por ejemplo, la salida de los archivos anteriores sería simplemente
8 4
mi script de shell se ve así:
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
¿Qué hay de ...
head -n 2 input.dat | tail -n 1 | awk
...fuente
head
/tail
es definitivamente una opción, no es necesarioawk
entonces.sed
seria suficiente:-s
se necesita la opción para imprimir la segunda línea de cada archivo, de lo contrario solo se imprimirá la segunda línea del primer archivo.fuente
La
sed
solución de Aragaer es la mejor, sí. Pero desde que disfruto un poco dehead|tail
corte, tengo unahead|tail
solución que admite múltiples archivos, no solo unoinput.dat
. El uso de un bucle for, en lugar de pasar una lista de archivos a sed, también facilita hacer otra cosa con el archivo antes / después de extraer la segunda línea con sed.Versión multilínea copiosamente comentada:
NB: se ejecutará el siguiente código. Somos libres para poner un salto de línea después de una
|
,&&
o||
, y continuar nuestro comando en la línea siguiente; incluso podemos poner comentarios en el medio. Pasé años sin saber esto (y sin verlo realmente en ningún lado). Este estilo es menos útil en la solicitud interactiva, pero limpia los archivos de script sin fin.fuente
Obviamente, hay muchas maneras de hacer esto: creo que me gusta más la respuesta sed de @ aragaer .
Aquí hay uno que usa puramente bash builtins y no necesita bifurcar ninguna utilidad externa:
fuente
Para un uso eficiente de
awk
ysed
en las respuestas aquí en múltiples archivos, es mejor usar unanextfile
declaración para omitir el procesamiento de líneas no deseadasawk
.y con
sed
, podemos salir al procesar el 3 rd línea ysed
vamos a procesar el siguiente archivo.fuente