uso ultimo sromero programacion numero mayor imprimir filtrar eliminar columnas caracteres campo básico shell unix awk

shell - ultimo - programacion awk



Recortar los espacios iniciales y finales de una cuerda en awk (8)

La solución más simple es probablemente usar tr

$ cat -A input ^I Name, ^IOrder $ Trim, working $ cat,cat1^I $ tr -d ''[:blank:]'' < input | cat -A Name,Order$ Trim,working$ cat,cat1

Estoy intentando eliminar el espacio input.txt y final en la segunda columna de la entrada input.txt siguiente:

Name, Order
Trim, working
cat,cat1

Utilicé el siguiente awk para eliminar el espacio inicial y final en la segunda columna, pero no está funcionando. ¿Qué me estoy perdiendo?

awk -F, ''{$2=$2};1'' input.txt

Esto le da a la salida como:

Name, Order
Trim, working
cat,cat1

Los espacios iniciales y finales no se eliminan.


Lo siguiente parece funcionar:

awk -F'',[[:blank:]]*'' ''{$2=$2}1'' OFS="," input.txt


Me acabo de enterar de esto. La respuesta correcta es:

awk ''BEGIN{FS=OFS=","} {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)} 1''


Si desea recortar todos los espacios, solo en líneas que tienen una coma, y ​​usa awk , entonces lo siguiente funcionará para usted:

awk -F, ''/,/{gsub(/ /, "", $0); print} '' input.txt

Si solo desea eliminar espacios en la segunda columna, cambie la expresión a

awk -F, ''/,/{gsub(/ /, "", $2); print$1","$2} '' input.txt

Tenga en cuenta que gsub sustituye el carácter en // con la segunda expresión, en la variable que es el tercer parámetro, y lo hace in-place , en otras palabras, cuando termina, se han modificado los $0 (o $2 ).

Explicación completa:

-F, use comma as field separator (so the thing before the first comma is $1, etc) /,/ operate only on lines with a comma (this means empty lines are skipped) gsub(a,b,c) match the regular expression a, replace it with b, and do all this with the contents of c print$1","$2 print the contents of field 1, a comma, then field 2 input.txt use input.txt as the source of lines to process

EDITAR Quiero señalar que la solución de gsub es mejor, ya que solo recorta los espacios gsub y finales con dos comandos gsub sucesivos. Mientras doy crédito, daré una explicación de cómo funciona.

gsub(/^[ /t]+/,"",$2); - starting at the beginning (^) replace all (+ = zero or more, greedy) consecutive tabs and spaces with an empty string gsub(/[ /t]+$/,"",$2)} - do the same, but now for all space up to the end of string ($) 1 - ="true". Shorthand for "use default action", which is print $0 - that is, print the entire (modified) line


Si es seguro asumir solo un conjunto de espacios en la columna dos (que es el ejemplo original):

awk ''{print $1$2}'' /tmp/input.txt

Agregar otro campo, por ejemplo, awk ''{print $1$2$3}'' /tmp/input.txt capturará dos conjuntos de espacios (hasta tres palabras en la columna dos), y no se dividirá si hay menos.

Si tiene una cantidad indeterminada (grande) de palabras delimitadas por espacios, usaría una de las sugerencias anteriores, de lo contrario, esta solución es la más fácil que encontrará usando awk.


Yo usaría sed :

sed ''s/, /,/'' input.txt

Esto se eliminará en el espacio delantero después de,. Salida:

Name,Order Trim,working cat,cat1

Más general podría ser lo siguiente, eliminará posiblemente múltiples espacios y / o pestañas después de,:

sed ''s/,[ /t]/?/,/g'' input.txt

También funcionará con más de dos columnas debido al modificador global /g

@Floris pidió en el debate una solución que elimine los espacios en blanco y en blanco en cada columna (incluso la primera y la última) sin quitar los espacios en blanco en el medio de una columna:

sed ''s/[ /t]/?,[ /t]/?/,/g; s/^[ /t]/+//g; s/[ /t]/+$//g''

IMO sed es la herramienta óptima para este trabajo. Sin embargo, aquí viene una solución con awk porque usted ha pedido eso:

awk -F'', '' ''{printf "%s,%s/n", $1, $2}'' input.txt

Otra solución simple que se tiene en cuenta para eliminar todos los espacios en blanco es tr -d :

cat input.txt | tr -d '' ''


eliminar el espacio blanco anterior y posterior en la 2da columna

awk ''BEGIN{FS=OFS=","}{gsub(/^[ /t]+/,"",$2);gsub(/[ /t]+$/,"",$2)}1'' input.txt

otra forma por un gsub:

awk ''BEGIN{FS=OFS=","} {gsub(/^[ /t]+|[ /t]+$/, "", $2)}1'' infile


solo use una expresión regular como separador:

'', *'' - para espacios principales

''*,'' - para espacios finales

para ambos, líder y final:

awk -F'' *, *'' ''{print $1","$2}'' input.txt