¿Cómo selecciono la primera columna de la cadena separada por TAB?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Lo anterior devolverá la línea completa y no solo "LOAD_SETTLED" como se esperaba.
Actualizar:
Necesito cambiar la tercera columna en los valores separados por tabulaciones. Lo siguiente no funciona.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
Sin embargo, esto funciona como se esperaba si el separador es una coma en lugar de un tabulador.
echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt
awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt
imprimir valores delimitados por tabulaciones de las tres primeras columnas.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
configuración de variables. Es feo usarloBEGIN {FS="\t"}
dentro de un programa en línea , y es probable que se objete cualquier contribución de código abierto que intente hacer de esa manera. Solo haga eso si está escribiendo un archivo de programa . Además, se desaconseja usar en-F
lugar de-v FS=
porque este último deja claro que soloFS
se está configurando y noOFS
. La confusión sobre ese último punto es lo que causó esta publicación en primer lugar. Por eso es importante el "buen estilo".OFS
variable.Respuestas:
Debe configurar la
OFS
variable (separador de campo de salida) para que sea una pestaña:echo "$line" | awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
(asegúrese de citar la
$line
variable en la declaración de eco)fuente
$
de$'\t'
que no se necesita. El wiki de Greg es mejor: "De estos,$'...'
es el más común y actúa como comillas simples, excepto que las combinaciones con barra invertida se expanden según lo especificado por el estándar ANSI C".$'\t'
no es necesario. awk entiende que la cadena"\t"
es un carácter de tabulaciónawk -F $'\t' 'BEGIN {OFS = FS} …'
. Eso debería serawk -v FS='\t' -v OFS='\t' '…'
. Puede parecer pedante, pero ser inconsistente aumenta las posibilidades de que un colaborador posterior introduzca un error porque malinterpreta su código.¡Asegúrate de que sean realmente pestañas! En bash, puede insertar una pestaña usandoC-v TAB
$ echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F$'\t' '{print $1}' LOAD_SETTLED
fuente
Puede configurar el Separador de campos:
... | awk 'BEGIN {FS="\t"}; {print $1}'
Excelente lectura:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
fuente
Utilizo las variables
FS
yOFS
para manipular archivos de zona BIND que están delimitados por tabulaciones. Aquí está uno de mis scripts https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39La carne es:
awk -v FS='\t' -v OFS='\t' \ -v record_type=$record_type \ -v hostname=$hostname \ -v ip_address=$ip_address ' $1==hostname && $3==record_type {$4=ip_address} {print} ' $zone_file > $temp
Esta es una forma limpia y fácil de leer de hacer esto.
fuente
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'
fuente
¿No debería funcionar esto?
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk '{print $1}'
fuente