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