register fpca sed awk

sed - register - fpca



Reemplazo en el lugar (6)

Tengo un CSV. Quiero editar el campo número 35 del CSV y escribir el cambio nuevamente en el campo número 35. Esto es lo que estoy haciendo en bash:

awk -F "," ''{print $35}'' test.csv | sed -i ''s/^0/+91/g''

entonces, estoy sacando la entrada 35 usando awk y luego reemplazando el "0" en la posición inicial en la cadena con "+91". Este funciona bien y obtengo la salida deseada en la consola.

Ahora quiero que esta nueva entrada se escriba en el archivo. Estoy pensando en la función de reemplazo "in-situ" de sed, pero este fetuare necesita un archivo de entrada. En el comando anterior, no puedo proporcionar el archivo de entrada porque mi comando primario es awk y sed está tomando la entrada de awk.

Gracias.


Debe elegir una de las dos herramientas. En cuanto a sed , se puede hacer de la siguiente manera:

sed -ri ''s/^(([^,]*,){34})0([^,]*)//1+91/3/'' test.csv

No estoy seguro acerca de awk , pero el comentario de @hellter podría ayudar con eso.


Entonces, resultó que hay muchas formas de hacerlo. Lo tengo trabajando con sed como a continuación:

sed -i ''s/0/([0-9]/{10/}/)//+91/1/g'' test.csv

Pero esto es poco complicado ya que editará cualquier entrada que coincida con los criterios. sin embargo, en mi caso, está funcionando bien.

Implementación similar de la lógica anterior en Perl:

perl -p -i -e ''s//b0(/d{10})/b//+91$1/g;'' test.csv

De nuevo, la misma advertencia que se menciona arriba.

Una forma más precisa de hacerlo, como lo muestra Lev Levitsky, ya que operará específicamente en el campo número 35.

sed -ri ''s/^(([^,]*,){34})0([^,]*)//1+91/3/g'' test.csv

Para situaciones más complejas, tendré que considerar usar cualquiera de los módulos csv de perl.

Gracias a todos por su tiempo y aporte. Seguramente sé más sobre sed / awk después de leer sus respuestas.


Esto podría funcionar para usted:

sed -i ''s/[^,]*/+91/35'' test.csv

EDITAR:

Para reemplazar el cero inicial en el campo 35º:

sed ''h;s/[^,]*//n&/35;//n0/!{x;b};s//+91/'' test.csv

o más simplemente:

|sed ''s/^/(/([^,]*,/)/{34/}/)0//1+91/'' test.csv


La característica in-place de sed tiene un nombre erróneo, ya que no edita el archivo en su lugar. En cambio, crea un nuevo archivo con el mismo nombre. p.ej:

$ echo foo > foo $ ln -f foo bar $ ls -i foo bar # These are the same file 797325 bar 797325 foo $ echo new-text > foo # Changes bar $ cat bar new-text $ printf ''/new/s//newer/nw/nq/n'' | ed foo # Edit foo "in-place"; changes bar 9 newer-text 11 $ cat bar newer-text $ ls -i foo bar # Still the same file 797325 bar 797325 foo $ sed -i s/new/newer/ foo # Does not edit in-place; creates a new file $ ls -i foo bar 797325 bar 792722 foo

Dado que sed no está editando el archivo en su lugar, sino escribiendo un nuevo archivo y luego renombrándolo al archivo anterior, también podrías hacer lo mismo.

awk ... test.csv | sed ... > test.csv.1 && mv test.csv.1 test.csv

Existe la percepción errónea de que el uso de sed -i alguna manera evita la creación del archivo temporal. No es asi. Simplemente oculta el hecho de ti. A veces la abstracción es algo bueno, pero otras veces es una ofuscación innecesaria. En el caso de sed -i , es el último. El shell es realmente bueno en la manipulación de archivos. Úselo según lo previsto. Si necesita editar un archivo en su lugar, no use la versión de transmisión de ed ; solo usa ed


Otra solución perl para editar el campo número 35 en el lugar:

perl -i -F, -lane ''$F[34] =~ s/^0/+91/; print join ",",@F'' test.csv

Estas opciones de línea de comando se usan:

  • -i edita el archivo en el lugar
  • -n loop alrededor de cada línea del archivo de entrada
  • -l elimina las nuevas líneas antes del procesamiento y las agrega de nuevo en adelante
  • -a modo autosplit - divide las líneas de entrada en la matriz @F . El valor predeterminado es la división en espacios en blanco.
  • -e ejecuta el código perl
  • -F modificador de autosplit, en este caso se divide ,

@F es la matriz de palabras en cada línea, indexada comenzando con 0
$F[34] es el elemento 35 de la matriz
s/^0/+91/ hace la sustitución


Si tiene más moreutils instaladas, simplemente puede usar la herramienta de sponge :

awk -F "," ''{print $35}'' test.csv | sed -i ''s/^0/+91/g'' | sponge test.csv

sponge absorbe la entrada, cierra el conducto de entrada (stdin) y, solo entonces, abre y escribe en el archivo test.csv .

A partir de 2015, moreutils está disponible en repositorios de paquetes de varias de las principales distribuciones de Linux, como Arch Linux , Debian y Ubuntu .