eliminar una columna con awk o sed

Tengo un archivo con tres columnas. Me gustaría eliminar la tercera columna (edición in situ). ¿Cómo puedo hacer esto con awk o sed?

123 abc 22.3 453 abg 56.7 1236 hjg 2.3 

Salida deseada

 123 abc 453 abg 1236 hjg 

Esto podría funcionar para usted (GNU sed):

 sed -i -r 's/\S+//3' file 

Si desea eliminar el espacio en blanco antes del tercer campo:

 sed -i -r 's/(\s+)?\S+//3' file 

prueba esta cosa corta:

 awk '!($3="")' file 

Con GNU awk para edición in situ, \s/\S y gensub() para eliminar

1) el PRIMER campo:

 awk -i inplace '{sub(/^\S+\s*/,"")}1' file 

o

 awk -i inplace '{$0=gensub(/^\S+\s*/,"",1)}1' file 

2) el ÚLTIMO campo:

 awk -i inplace '{sub(/\s*\S+$/,"")}1' file 

o

 awk -i inplace '{$0=gensub(/\s*\S+$/,"",1)}1' file 

3) el N ° campo donde N = 3:

 awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file 

Sin el awk de GNU, necesita un combo match() + substr() o múltiples sub() s + vars para eliminar un campo intermedio. Consulte también Imprimir todas menos las tres primeras columnas .

Parece que simplemente podrías ir con

 awk '{print $1 " " $2}' file 

Esto imprime los dos primeros campos de cada línea en su archivo de entrada, separados por un espacio.

Prueba esto :

 awk '$3="";1' file.txt > new_file && mv new_file file.txt 

o

 awk '{$3="";print}' file.txt > new_file && mv new_file file.txt 

GNU awk 4.1

 awk -i inplace NF-- 

Esto eliminará el último campo de cada línea.

Intenta usar cut … es rápido y fácil

Primero tienes espacios repetidos, puedes exprimirlos en un solo espacio entre columnas si eso es lo que quieres con tr -s ' '

Si cada columna ya tiene un delimitador entre ellas, puede usar cut -d ' ' -f-2 para imprimir campos (columnas) < = 2.

por ejemplo, si sus datos están en un archivo input.txt, puede hacer uno de los siguientes:

 cat input.txt | tr -s ' ' | cut -d ' ' -f-2 

O si es mejor que razone sobre este problema eliminando la tercera columna, puede escribir lo siguiente

 cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3 

el corte es bastante potente, también puede extraer rangos de bytes o caracteres, además de las columnas

extracto de la página man sobre la syntax de cómo especificar el rango de la lista

 Each LIST is made up of one range, or many ranges separated by commas. Selected input is written in the same order that it is read, and is written exactly once. Each range is one of: N N'th byte, character or field, counted from 1 N- from N'th byte, character or field, to end of line NM from N'th to M'th (included) byte, character or field -M from first to M'th (included) byte, character or field 

por lo que también podría haber dicho que quiere columnas específicas 1 y 2 con …

 cat input.txt | tr -s ' ' | cut -d ' ' -f1,2