separador print filtrar comparar columnas campos archivos awk gawk

print - awk unix



¿Hay alguna manera de eliminar completamente los campos en awk, para que los delimitadores adicionales no se impriman? (8)

Si solo busca eliminar columnas, puede usar cut :

cut -f 1,4- file.txt

Para emular cut :

awk -F "/t" ''{ for (i=1; i<=NF; i++) if (i != 2 && i != 3) { if (i == NF) printf $i"/n"; else printf $i"/t" } }'' file.txt

Similar:

awk -F "/t" ''{ delim =""; for (i=1; i<=NF; i++) if (i != 2 && i != 3) { printf delim $i; delim = "/t"; } printf "/n" }'' file.txt

HTH

Considera el siguiente comando:

gawk -F"/t" "BEGIN{OFS=/"/t/"}{$2=$3=/"/"; print $0}" Input.tsv

Cuando configuro $ 2 = $ 3 = "", el efecto deseado es obtener el mismo efecto que escribir:

print $1,$4,$5...$NF

Sin embargo, lo que realmente sucede es que obtengo dos campos vacíos, con los delimitadores de campo adicionales aún imprimiendo.

¿Es posible eliminar realmente $ 2 y $ 3?

Nota: Si esto fue en Linux en bash , la declaración correcta anterior sería la siguiente, pero Windows no maneja bien las comillas simples en cmd.exe .

gawk -F''/t'' ''BEGIN{OFS="/t"}{$2=$3=""; print $0}'' Input.tsv


No puede eliminar campos en el medio, pero puede eliminar campos al final, disminuyendo NF .

De modo que puede desplazar todos los campos posteriores hacia abajo para sobrescribir $2 y $3 luego disminuir NF en dos, lo que borra los dos últimos campos:

$ echo 1 2 3 4 5 6 7 | awk ''{for(i=2; i<NF-1; ++i) $i=$(i+2); NF-=2; print $0}'' 1 4 5 6 7


Una forma podría ser eliminar campos como lo hace y eliminar espacios adicionales con gsub :

awk ''BEGIN { FS = "/t" } { $2 = $3 = ""; gsub( //s+/, "/t" ); print }'' input-file


En la adición de la respuesta de Suicidal Steve, me gustaría sugerir una solución más, pero usando sed en lugar de awk.

Parece más complicado que el uso del corte como lo sugirió Steve. Pero fue la mejor solución porque sed -i permite la edición en el lugar.

sed -i ''s//(.*,/).*,.*,/(.*/)//1/2/'' FILENAME


La única forma en que puedo pensar en hacerlo en Awk sin usar un bucle es usar gsub en $0 para combinar FS adyacente:

$ echo {1..10} | awk ''{$2=$3=""; gsub(FS"+",FS); print}'' 1 4 5 6 7 8 9 10


Este es un viejo pero bueno.

Como señala Jonathan, no puede eliminar campos en el medio, pero puede reemplazar sus contenidos con los contenidos de otros campos. Y puede hacer una función reutilizable para manejar la eliminación por usted.

$ cat test.awk function rmcol(col, i) { for (i=col; i<NF; i++) { $i=$(i+1) } NF-- } { rmcol(3) } 1 $ printf ''one two three four/ntest red green blue/n'' | awk -f test.awk one two four test red blue


echo one two three four five six|awk ''{ print $0 is3=$3 $3="" print $0 print is3 }''

uno dos tres CUATRO CINCO SEIS

uno dos cuatro cinco seis

Tres


Bueno, si el objetivo es eliminar los delimitadores adicionales, entonces puede usar "tr" en Linux. Ejemplo:

$ echo "1,2 ,,, 5" | tr -s '',''

1,2,5