Tengo un 5 columnas del archivo csv (separados por espacios) como este :

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled 20130310 disabled

Soy tratando de cambiar el valor de la 4ª columna para username4.

Mi script ya se obtiene el número de línea y el nuevo valor a la tienda para username4 : así que me gustaría sustituir la columna 4 valor con $newValue en el número de línea $lineNumber.

Mi muestra:

newValue=anything
lineNumber=4

Por lo que va a hacer:

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled

Voy a utilizar sed en lugar de awk porque con sed que podemos hacer en la línea de cambios con -i

  • Lo has probado ya?
InformationsquelleAutor user2196728 | 2013-03-21

2 Comentarios

  1. 14

    Aquí hay una manera:

    $ sed '/^username4/{s/[^ ]*/anything/3}' file
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    # store changes back to the file 
    $ sed -i '/^username4/{s/[^ ]*/anything/3}' file

    Pero evitando awk porque sed tiene la -i opción no es una buena razón. awk es más conveniente para trabajar con este tipo de problema.

    $ awk '$1=="username4"{$4="anything"}1' file
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    # store changes back to the file
    $ awk '$1=="username4"{$4="anything"}1' file > tmp && mv tmp file

    Con awk usted puede hacer fácilmente campo de la comparación y de la edición, el uso variable de shell no es un citando pesadilla y la comprensión de los guiones que escribió ayer no es problema y a diferencia de con sed:

    $ linenumber=4
    
    $ newvalue=anything 
    
    $ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file 
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    $ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file > tmp && mv tmp file
  2. 1

    Esto podría funcionar para usted (GNU sed & Bash):

    lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file

    Sin embargo, tenga cuidado. Si el newValue contiene un / tendrá que cambiar el comando sustituir delimitador para algo más, por ejemplo, [email protected]\S\[email protected]${newValue}@4

    • esto funcionó bien !

Dejar respuesta

Please enter your comment!
Please enter your name here