Copie y reemplace la columna usando unix

Quiero copyr una primera columna de un file (.txt) y replacela con la primera columna del segundo file en text delimitado usando el código Unix.

file de formatting de file de input 1

01/01/2007 02/01/2007 03/01/2007 04/01/2007 

file 2

 20070101 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 20070102 10.2317 79.1638 5.6 26.5 20.8 1.9 13.6 98.0 20070103 10.2317 79.1638 7.5 27.7 20.8 0.1 15.8 96.4 20070104 10.2317 79.1638 8.1 26.0 19.6 0.0 15.5 94.1 

salida requerida

 01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 02/01/2007 10.2317 79.1638 5.6 26.5 20.8 1.9 13.6 98.0 03/01/2007 10.2317 79.1638 7.5 27.7 20.8 0.1 15.8 96.4 04/01/2007 10.2317 79.1638 8.1 26.0 19.6 0.0 15.5 94.1 

Solutions Collecting From Web of "Copie y reemplace la columna usando unix"

 $ cut -d' ' -f 2- file2 | paste file1 - 

El cut eliminará la primera columna del file2 ( -f 2- significa "campos de salida (columnas) 2 en adelante solamente"). El resultado de eso se pasará a paste que colocará el contenido del file1 en la primera columna. El command - in the paste es un marcador de position para lo que se entregue en la input estándar (la tubería de cut en este caso).

Paso a paso:

 $ cut -d' ' -f 2- file2 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 10.2317 79.1638 5.6 26.5 20.8 1.9 13.6 98.0 10.2317 79.1638 7.5 27.7 20.8 0.1 15.8 96.4 10.2317 79.1638 8.1 26.0 19.6 0.0 15.5 94.1 $ cut -d' ' -f 2- file2 | paste file1 - 01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 02/01/2007 10.2317 79.1638 5.6 26.5 20.8 1.9 13.6 98.0 03/01/2007 10.2317 79.1638 7.5 27.7 20.8 0.1 15.8 96.4 04/01/2007 10.2317 79.1638 8.1 26.0 19.6 0.0 15.5 94.1 

El command de cut espera una input delimitada por tabuladores, pero como he copydo y pegado tu pregunta, está delimitada por espacios. Si los datos originales están delimitados por tabuladores, elimine el -d' ' del command de cut .

El command paste agregará una pestaña entre las columnas 1 y 2 de forma pnetworkingeterminada. Si desea un espacio en su lugar, use paste -d' ' file1 - .

En otra pregunta , se le preguntó cómo usar la date ya existente en el file2 aquí, y eliminar completamente el primer file.

Terminé con

 $ paste <( date -f <( cut -d ' ' -f 1 file2 ) +"%d/%m/%Y" ) \ <( cut -d ' ' -f 2- file2 ) 01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 02/01/2007 10.2317 79.1638 5.6 26.5 20.8 1.9 13.6 98.0 03/01/2007 10.2317 79.1638 7.5 27.7 20.8 0.1 15.8 96.4 04/01/2007 10.2317 79.1638 8.1 26.0 19.6 0.0 15.5 94.1 

Tenga en count que esto requiere un shell que comprenda la sustitución de processs ( <( ... ) ), como bash o ksh , y también requiere la implementación de la date de GNU.

Un poco de explicación puede estar en order:

La sustitución de process <( ... ) genera más o less un file temporal que contiene el resultado del command dentro del paréntesis (en realidad, un FIFO en /dev/fd ). Entonces todo el command pasará por dos pasos de sustitución:

 pegar <(date -f output_of_cut1 + "% d /% m /% Y") \
       output_from_cut2

date -f filename leerá las dates en el filename file y formateará cada una de ellas de acuerdo con la cadena de formatting dada.

Entonces:

 pegar output_from_date output_from_cut2

que pegará juntas las columnas con el resultado de la date como la primera columna y la salida del segundo cut como las otras columnas.

Según la versión de awk , puede transformar la primera columna con:

 awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}' FILE2.csv 

ejemplo:

 echo "20070101 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6" | awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}' 

devoluciones:

  01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6 

Notas:

Primera parte networkingefina el valor de las primeras columnas

  $1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4) 

e print $0 imprime toda la línea con la primera columna networkingefinida

Puedes usar awk para esto:

 awk 'NR==FNR{a[++i]=$1;next}{$1=a[++k]; print}' file1 file2 

NR==FNR es un significado de patrón: {a[++i]=$1;next} se ejecuta en cada logging (es decir, línea) en file1.

a[++i]=$1;next significa: guarde el primer campo del logging (es decir, la línea) en la matriz con el índice del número de logging (es decir, el número de línea del file1), luego lea en el siguiente logging

$1=a[++k]; print medios de $1=a[++k]; print : copie el contenido de la matriz con indx k en el primer campo del logging actual (es decir, la línea) (que siempre es el logging k-ésimo (es decir, la línea) del file2).