![]() |
|
|
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 |
| Al cambiar los permisos usando FTP | panknil | Programación de scripts de shell y | 3 | 11-07-2007 08:08 PM |
| Cambiar tu userID y cambio de grupo y GID | deal732 | Programación de scripts de shell y | 2 | 04-18-2007 11:09 AM |
| Cambiar el orden de utilización de sed | venu_nbk | UNIX for Dummies Preguntas y Respuestas | 9 | 07-29-2006 06:03 PM |
| Cambio de usuarios | Bab00shka | Programación de scripts de shell y | 2 | 08-01-2003 05:44 AM |
| Cambio de IP del | Hordak | UNIX for Dummies Preguntas y Respuestas | 2 | 08-03-2002 01:42 AM |
![]() |
|
|
Linkback vínculo | Herramientas de hilo | Buscar en este Hilo | Tasa de Hilo | Modos de visualización |
|
|
|
||||
|
Hola, Aquí está (una parte) del archivo que desea cambiar. Tenga en cuenta los tres espacios antes de que el "3" (podría ser "2" o "0" también). Código:
3 621530 1.1935E-02 631530 1.1293E+01 641530 1.1117E-02 571540 4.4419E-14 3 581540 2.6670E-10 591540 3.8610E-09 601540 1.1016E-06 611540 3.2618E-06 3 611541 6.5572E-07 621540 9.8307E+00 631540 3.1177E+00 641540 1.4615E+00 3 571550 0.0000E+00 581550 8.8139E-12 591550 1.0739E-09 601550 2.5639E-07 3 611550 1.1011E-06 621550 3.6787E-05 631550 3.4821E+00 641550 3.1855E+00 3 641551 0.0000E+00 581560 9.4585E-13 591560 7.5358E-11 601560 1.2023E-07 3 611560 1.7968E-07 621560 5.4237E-04 631560 3.0054E-02 641560 6.5687E+00 3 581570 2.3926E-14 591570 9.9322E-12 601570 4.3929E-09 611570 4.6793E-07 3 621570 5.5911E-06 631570 6.3564E-04 641570 3.2355E+00 591580 2.8608E-13 Quiero encontrar algunos ID (por ejemplo, 621530) y cambiar el valor posterior. Estoy usando este script: Código:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{}
NR==FNR{a[$0]=$0; next}
{for(i=2;i<9;i+=2)if($i in a){$(i+1)=var}}
#{$1=" "$1}
{print}' ID_to_be_changed my_file
El problema es que elimina los tres espacios en el frente de la fila si cambia algo en la fila ... la eliminación de la línea comentó soluciona el problema. Sin embargo no sé cómo mantener el mismo número de espacios entre las líneas: 2 espacios entre el ID y el valor siguiente, y 1 espacio entre un valor y después de que el ID (la secuencia de comandos todo lo convierte en un solo espacio). ¿Puede alguien ayudarme? |
|
||||
|
Ya he intentado ... El problema entonces es que todos mis columnas son sólo un espacio con el espacio! Quiero mantener la estructura: Código:
" "3" "xxxxxx" "x.xxxxExx" "xxxxxx" "x.xxxxExx"... |
|
||||
|
Por ahora, la única solución que tengo es: Código:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" "}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){print " ",$1,$2," "$3,$4," "$5,$6," "$7,$8," "$9;next}}
{print}' ID_to_be_changed my_file
De hecho, para algunas líneas, algunos valores no tienen el formato "x.xxxxExxx", pero menos caracteres (por ejemplo, "0.0"). Luego, la falta de personajes son "espacios" para mantener el alineamiento: Código:
2 982520 1.6134E-14 982530 1.7241E-17 982540 3.4164E-20 982550 1.2285E-24 2 992530 1.8708E-17 992541 6.2076E-22 992540 7.5646E-20 992550 7.0917E-22 2 162500 7.6697E-08 0 0.0000E+00 0 0.0000E+00 0 0.0000E+00 3 10030 2.0892E-01 30060 6.0786E-04 30070 1.3046E-05 40090 1.9438E-05 3 40100 1.1748E-04 60140 1.6964E-05 280660 0.0000E+00 290660 1.4066E-14 3 300660 5.0403E-09 290670 7.6644E-19 300670 2.4718E-10 300680 1.1002E-12 Mi solución funciona siempre y cuando no me cambio de valores situada en las filas de "reducido" personajes ... (siempre que no se cambiará nada en la fila, awk no vuelva a concatenar la fila, por lo tanto, conservar el derecho de espaciamiento). Además, el uso de todos los argumentos en la impresión no es conveniente ... ¿Cómo podría solucionar estos dos problemas? |
|
||||
|
Puede usar printf para imprimir la línea con un formato fijo, algo así como: Código:
VALUE=".........."
awk -v var="$VALUE" 'BEGIN{FS=OFS=" ";fmt="%5s%7s%12s%7s%12s%7s%12s%7s%12s\n"}
NR==FNR{a[$0]=$0; next}
{for(i=4;i<9;i+=2)if($i in a){$(i+1)=var}}
{for(i=4;i<9;i+=2)if($i in a){printf(fmt,$1,$2,$3,$4,$5,$6,$7,$8,$9);next}}
{print}' ID_to_be_changed my_file
Recuerdos |
![]() |
| Marcadores |
| Herramientas de hilo | Buscar en este Hilo |
| Modos de visualización | Vota a este hilo |
|
|