![]() |
Hola y bienvenida de los Estados Unidos a la UNIX y Linux Foros! Gracias por su visita y formar parte de nuestra comunidad global.
|
|
google unix.com
|
|||||||
| Foros | Registro | Reglas de los Foros | Enlaces | Álbumes | Preguntas más frecuentes | Lista de miembros | Calendario | Búsqueda | Puestos de hoy | Marcar Foros Como Leídos |
| Programación de scripts de shell y Plantear preguntas sobre KSH, CSH, SH, BASH, PERL, PHP, SED, AWK y otros scripts de shell y lenguajes de script de shell aquí. |
Más UNIX y Linux Foro Temas usted puede encontrar útiles
|
||||
| Hilo | Hilo para principiantes | Foro | Respuestas | Último mensaje |
| Sed de ayuda en la actualización de algo sólo en un caso concreto. | bisla.yogender | Programación de scripts de shell y | 4 | 03-24-2008 11:48 AM |
| A saber si el archivo es la actualización o no | raj333 | Programación de scripts de shell y | 2 | 11-05-2007 05:29 PM |
| Actualización de archivos en bucle | braindrain | Programación de scripts de shell y | 4 | 06-20-2007 02:37 PM |
| ¿Por qué mi sar no se actualiza el archivo de salida. | skneeli | UNIX para usuarios avanzados y expertos | 1 | 11-12-2006 08:29 PM |
| La actualización de un archivo en un archivo Zip | dbridle | AIX | 6 | 09-27-2006 04:29 PM |
![]() |
|
|
Linkback vínculo | Herramientas de hilo | Buscar en este Hilo | Tasa de Hilo | Modos de visualización |
|
|
|
||||
|
awk actualización de un archivo con otro, la comparación, la actualización
Hola,
He leído y de búsqueda a través de este maravilloso foro y trataron diferentes enfoques, pero parece que falta un poco de conocimiento y de las neuronas ^ ^ Aquí está lo que estoy tratando de lograr: archivo1: prueba Filea 3495; prueba fileb 4578; prueba filec 7689; prueba Filey 9978; prueba filez 12300; archivo2: prueba Filea 3495; 4578 prueba presentada; prueba filec 7689; prueba filex 8978; resultados: prueba Filea 3495; 4578 prueba presentada; prueba filec 7689; prueba filex 8978; prueba Filey 9978; prueba filez 12300; sobre la base de comparación en el último campo (campo $ 3), un nuevo contenido de archivo2 (aquí el contenido de "clave" es nuevo 8978), debe añadirse a la producción final y el contenido que es diferente en archivo2 (4578 prueba presentada en este caso) debería sustituir a una archivo1 . aquí es donde estoy ahora: awk '(clave NF \u003d $ NF; claves [clave] + +) (NR \u003d\u003d FNR key1 [clave] \u003d $ NF SRO; rec1 [clave] \u003d $ 0 SRO;) (siguiente Key2 [clave] \u003d $ NF ORS; rec2 [clave] \u003d $ 0 SRO;) próximo FIN (for (k en las llaves) (if (key1 [k] \u003d\u003d Key2 [k]) (print rec2 [k]) else (print rec1 [k]))) ' $ archivo1 $ archivo2> $ file1.updated para facilitar la lectura: awk ' NF ( clave \u003d $ NF; teclas [clave] + + ) NR \u003d\u003d FNR ( key1 [clave] \u003d $ NF ORS; rec1 [clave] \u003d $ 0 ORS; siguiente ) ( Key2 [clave] \u003d $ NF ORS; rec2 [clave] \u003d $ 0 ORS; siguiente ) FIN ( para (k en las teclas) ( if (key1 [k] \u003d\u003d Key2 [k]) ( imprimir rec2 [k] ) algo más ( imprimir rec1 [k] ) ) ) ' $ archivo1 $ archivo2> $ file1.updated pero .. esto no funciona así: / |
|
||||
|
oh mi ....
![]() muchas gracias! Yo pensaba que la solución es algo así como guardar las claves de archivo1, archivo2 iterar sobre ellos, y luego invertir la iteración para encontrar registros que faltan ... Yo estaba muy lejos de la belleza de awk ... si he entendido bien, awk lee los dos archivos y registros automágicamente fusionada sí misma? Esto significa que no hay necesidad de almacenar los valores de archivo1 comparar a archivo2? Beautifull ... Dos cosas que no entiendo: la utilización de los bajo (si bien creo que significa "leer todos los registros?"), Y por qué no se FIN al final? Sobre el tipo de comando que no fallar en el ';'? ¿Sabe usted cómo especificar 'último campo "de acuerdo con clase? ¿O es algo así como: | Awk '(printf substr ($ NF, 1, length ($ NF) -1), $ NF \u003d ""; printf "% s \ n", $ 0)' | sort-n | awk '(printf "% s % s, \ n ", $ 0, $ 1) '| awk' ($ 1 \u003d" "; sub (/ ^ + /," "); printf"% s \ n ", $ 0) ' preferible? Muchas gracias de nuevo radoulov ^ ^ |
|
|||||
|
Cita:
de la clave ($ NF en este caso) y el valor es siempre el último de los cuales se ve (uno en el archivo2). Se asociará a cada clave ($ NF) el registro completo ($ 0) y se actualizará el valor cuando se ve la misma clave. Cita:
que desea que el código más legible, puede usar esto en vez (y esto es compatible incluso con la antigua llanura Solaris awk): Código:
awk '{
key_record[$NF] = $0 # associate key ($NF) with entire record ($0)
}
END {
# after the entire input has been read
for (key in key_record) # for every key stored
print key_record[key] # print the associated value
}' file1 file2
Cita:
Cita:
En ese caso, yo iría con: Código:
perl -lane'
$h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Código:
perl -lane'
chop $F[-1] and $h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Código:
read<file;set -- $REPLY;sort -k$#n file |
|
||||
|
Muchas gracias por tomarse el tiempo para explicar todo esto radoulov ^ ^ eso es genial!
Cita:
27384; 7384, o 384; pero he intentado tantas cosas, Creo que esto debe seguir siendo una de mistypes / errores de mi parte o por la línea de Windows terminaciones algunos archivos parece haber (algunas se crean archivos en Windows y en Unix)? N el último campo no es fijo porque estoy en un script bash utilidad para archivos de consultas SQL de selección y actualización, tiene que ser utilizado en varios archivos diferentes, donde el número de campos no es siempre el mismo y cuando el valor de clave puede ser , pero rara vez ocurre, en medio de la línea. Así pues, en este caso de $ argumentos clave de clima: awk 'FIN (for (k en _) _ impresión [k ]}{_[$'"$ clave "']\u003d$ 0)' $ archivo1 $ archivo2> $ file1.updated con un argumento adicional condicionada a'0 'para el final de la línea (porque no he tenido $ clave para convertirse en NF y teniendo awk' "$ key"). Estoy haciendo una pequeña comunidad y tiene que ser muy simple. Si no estás miedo de leer el código awfull puesto que puedo ^ ^ |
|
||||
|
Hola soy muy nuevo y unix awk, mi exigencia es muy similar a este ..
Quiero comparar por primera columna, archivo1: 0000-00058 | Verde 0000-00059 | Verde 0000-00060 | Verde 0402-01055 | Verde 0402-01058 | Verde 0402-01059 | Verde 0402-01061 | Verde 0402-01065 | Verde archivo2: 0000-00057 | Roja 0000-00058 | Azul 0000-00059 | Roja 0000-00060 | Azul Mi resultado debe ser 0000-00058 |Azul 0000-00059 |Rojo 0000-00060 |Azul 0402-01055 | Verde 0402-01058 | Verde 0402-01059 | Verde 0402-01061 | Verde 0402-01065 | Verde 0000-00057 | Roja la espera de su respuesta ... Thank u. |
![]() |
| Marcadores |
| Etiquetas |
| solaris |
| Herramientas de hilo | Buscar en este Hilo |
| Modos de visualización | Vota a este hilo |
|
|