2012-08-27 4 views
5

Tengo dos archivos de csv/texto que me gustaría unir. Ambos contienen la misma primera línea. Intento averiguar cómo usar sed y cat para producir un archivo fusionado, pero con solo una copia de la primera línea. Y estoy teniendo un tiempo con la sintaxis. Cualquier ayuda sería muy apreciada: ¡D! Gracias , AndrewArchivo1 + (Archivo2 - primera línea)> Archivo3

Respuesta

4

Esto combinar archivos y data1.txtdata2.txt en el archivo merged.txt, omitiendo la primera línea de data2.txt. Utiliza awk si estás bien con él:

(cat data1.txt; awk 'NR>1' data2.txt) > merged.txt 

awk agrega todas las líneas con número de línea> 1 de archivo data2.txt para presentar merged.txt.

NR es una variable incorporada awk que representa el número de línea actual del archivo que se está procesando. Si la expresión booleana NR > 1 es verdadera, awk imprime la línea implícitamente.

Si no se preocupan por mantener intacta data1.txt, usted podría añadir a su segundo archivo (menos su primera línea) y reducir a esto:

awk 'NR>1' data2.txt >> data1.txt 
+2

Alternativamente, puede usar 'tail -n + 2' en lugar de' awk 'NR> 1''. –

+0

@ TannerL.Swett Neat .. Estaba pensando en usar 'head' o' tail' de alguna manera, pero estaba seguro de cómo hacerlo con 'awk'. Y, por supuesto, si a OP no le importa guardar 'data1.txt', la solución podría omitir el primer comando y anexar el segundo archivo (la primera línea) a ese archivo. – Levon

4

Otra opción con awk:

awk 'NR==FNR || FNR>1' file1.txt file2.txt .. fileN.txt 

Esto imprime todas las líneas en el primer archivo, O cualquier línea en los archivos posteriores después de la primera línea.

+0

qué pasaría si hiciera esto: 'awk 'NR == FNR || FNR> 1 '* .txt' –

+0

Confiaría en el orden de los archivos que coincidían con el archivo globbing. Si todos contienen las primeras líneas idénticas, entonces esto debería ser seguro. ¿Por qué no lo intentas y ves qué pasa? – ghoti

1

resuelto con una línea '1 d' significa eliminar primera línea en fichero2

el siguiente comando añadirá el resultado de archivo1

sed '1 d' file2 >> file1 
+0

Está modificando 'file1' y' file2' con este comando; esto puede o no estar bien con OP. Es mejor proporcionar ambas opciones (la otra no cambia ninguno de los archivos originales). – Levon

+0

@Levon: no, no está modificando 'file2' aquí. – tripleee

+0

@tripleee Acabo de probarlo, no * elimina * sino que * no muestra * la primera línea .. lo obtuve. Sin embargo, probablemente podría formularse mejor en la respuesta. – Levon

2

Yo diría que la solución más sencilla es:

(cat file1.txt ; tail -n +2 file2.txt) > file3.txt 

Tiene la ventaja de indicar con claridad exactamente lo que está haciendo: imprimir todo el primer archivo, a continuación, imprimir todos excepto la primera línea de la sE archivo cond, escribiendo el resultado en el tercer archivo.

+0

¡Guau! ¡¡¡¡¡¡¡Gracias a todos!!!!!!! :-RE –

Cuestiones relacionadas