2011-03-21 22 views
59

¿Cómo selecciono la primera columna de la cadena TAB separada?Valores separados por tabuladores en awk

# echo "LOAD_SETTLED LOAD_INIT  2011-01-13 03:50:01" | awk -F'\t' '{print $1}' 

Lo anterior devolverá toda la línea y no solo "LOAD_SETTLED" como se esperaba.

Actualización:

tengo que cambiar la tercera columna de 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 una pestaña.

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt 
+3

awk 'BEGIN {FS = "[\ t] +"}; {print $ 1} '# esto es lo que estaba buscando. ¿Mi búsqueda de google es correcta? :) – shantanuo

+2

Gracias a este comentario, he descubierto: 'awk 'BEGIN {FS =" \ t "}; {print $ 1, FS, $ 2, FS, $ 3} 'myFile.txt' para imprimir valores delimitados por tabuladores de las primeras tres columnas. – Wok

+3

O tal vez simplemente 'awk' BEGIN {OFS = "\ t"}; {print $ 1, $ 2, $ 3} '' –

Respuesta

100

Es necesario configurar el OFS variable (separador de campos de salida) a ser una pestaña:

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}' 

(asegúrese cita la variable $line en la instrucción de eco)

+17

+1 para '$ '\ t'' :) –

+2

¿Cuál es el propósito de $ in $' \ t '? –

+9

Respondiendo a mi propia pregunta de [Advanced Bash Scripting Guide] (http://tldp.org/LDP/abs/html/escapingsection.html): la construcción de expansión de cadena citada $ '...' es un mecanismo que usa escapó valores octales o hexadecimales ..., p. ej., cita = $ '\ 042'. –

12

¡Asegúrate de que realmente sean pestañas! En bash, puede insertar una tabulación con Cv TAB

$ echo "LOAD_SETTLED LOAD_INIT  2011-01-13 03:50:01" | awk -F$'\t' '{print $1}' 
LOAD_SETTLED 
5
echo "LOAD_SETTLED LOAD_INIT  2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }' 
0

¿No debería funcionar?

echo "LOAD_SETTLED LOAD_INIT  2011-01-13 03:50:01" | awk '{print $1}' 
Cuestiones relacionadas