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