2010-08-30 8 views
12

Tengo dos archivos que quiero cazar juntos. Sin embargo, la última línea del primer archivo y la primera línea del último archivo deben omitirse.¿Cómo cazar dos archivos uno detrás de otro pero omite la última/primera línea, respectivamente?

Estoy seguro de que esto se puede hacer en un shell UNIX (o más bien, Cygwin). ¿Pero cómo?

+2

realmente necesitamos un sitio scriptingOverflow .... – leppie

+1

@leppie, algunos de nosotros creemos que scripting es tanto la programación como la compilación :-) – paxdiablo

Respuesta

15
$ head --lines=-1 file1 > res 
$ tail --lines=+2 file2 >> res 
3

puede utilizar:

head -n -1 file1 && tail -n +2 file2 

cabeza muestra las primeras líneas de un archivo, el parámetro -n muestra los primeros n líneas del archivo, pero si se pone un - antes del número, que muestra todos el archivo excepto las últimas n líneas.

cola es análogo ..

para una mejor referencia:

hombrehead

hombretail

+0

cola 1 incluye la primera línea. debería ser +2. – Frank

+0

sí, publiqué y probé: P – Marco

+0

extrañamente, 'tail -n -1' tiene el mismo efecto que' tail -n + 2' – bastibe

1

La siguiente transcripción muestra cómo lograr esto:

pax> cat file1.txt 
1.1 
1.2 
1.3 
1.4 
1.5 

pax> cat file2.txt 
2.1 
2.2 
2.3 
2.4 
2.5 

pax> head --lines=-1 file1.txt ; tail --lines=+2 file2.txt 
1.1 
1.2 
1.3 
1.4 
2.2 
2.3 
2.4 
2.5 

Al dar el comando head, un recuento negativo llega hasta ese extremo desde el final. De manera similar, un recuento que comienza con + hace que tail comience en esa línea en lugar de una cierta cantidad de líneas desde el final.

1
head -n -1 file1 

imprimirá todas las líneas en file1 excepto en la última línea.

tail -n +2 file2 

imprimirá todas las líneas en file2 excepto la primera línea.

combinar los dos como:

head -n -1 file1 ; tail -n +2 file2 
2
awk 'FNR>2{print p}{p=$0}' file1 file2 

Explicación conforme a lo solicitado:

FNR es el número de registro actual del archivo actual que se está procesando. Al comienzo de cada iteración, la línea se almacena en la variable "p", pero aún no se imprime. Como el número de registro llega a 3, se imprime la variable "p", que contiene el registro 2. Esto significa la 2da línea. Cuando awk llega al final del archivo, la última línea no se imprime y luego pasa al siguiente archivo.

+0

ghostdog74 nos ilumina con lo que está pasando aquí :) – codaddict

+0

¿No es así? eliminar la primera y la última línea de _both_ archivos? La pregunta era para la última línea del primer archivo y la primera línea del segundo archivo, ¿no es así? – paxdiablo

1

no soy capaz de utilizar el comando siguiente en mi Mac (más específicamente, en una cáscara del golpe que se ejecuta en una ventana de terminal de Mac OS X 10.7.5):

head -n -1 file1 

El comando anterior genera el mensaje de error siguiente:

head: illegal line count -- -1 

Parece que los valores negativos para el parámetro -n no se aceptan en la versión de Mac OS X de la cabecera.Sin embargo, se puede usar sed en su lugar:

sed -e '$d' file1 

[ "cola -n 2 fichero2" parece funcionar como se describió anteriormente en Mac OS X]

0

menudo utilizo sed para la cabeza de la cola | acciones:

{ sed '$d' file1; sed '1d' file2; } > combined 
Cuestiones relacionadas