Estoy tratando de eliminar las dos primeras columnas (de las cuales no estoy interesado) de un archivo de registro DbgView. Parece que no puedo encontrar un ejemplo que se imprima desde la columna 3 en adelante hasta el final de la línea. Tenga en cuenta que cada línea tiene un número variable de columnas.
linux
shell
unix
multiple-columns
Amit G
fuente
fuente
Respuestas:
... o una solución más simple:
cut -f 3- INPUTFILE
simplemente agregue el delimitador correcto (-d) y obtendrá el mismo efecto.fuente
fuente
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
no imprimirá el carácter de nueva línea, mientrasprint ""
que agregará una nueva línea después de que se hayan impreso los otros campos)echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, lo que da:3 4 5 6 7 8 9 10
.solución encontrada aquí:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
fuente
La respuesta de Jonathan Feinberg imprime cada campo en una línea separada. Puede usar
printf
para reconstruir el registro para la salida en la misma línea, pero también puede mover los campos un salto hacia la izquierda.fuente
NF
POSIX no permite la disminución .NF
se puede reducir.NB: este método dejará "espacios en blanco" en los campos 1, 2, 3, pero no es un problema si solo desea ver la salida.
fuente
1
? ¿Con qué palabra clave debo buscarawk
?{$1=$2=$3="";$0=$0;$1=$1}1
Si desea imprimir las columnas después de la tercera, por ejemplo, en la misma línea, puede usar:
Por ejemplo:
Se imprimirá:
Como podemos ver, la nómina incluso con espacio, se muestra en la línea correcta.
fuente
¿Qué pasa con la siguiente línea:
Basado en la sugerencia de @ ghostdog74. El mío debería comportarse mejor cuando filtra líneas, es decir:
fuente
sed 's/\s\+//g'
al final del comando para recortar los espaciosEsto corta lo que está antes del campo dado nr., N, e imprime todo el resto de la línea, incluido el campo nr.N y manteniendo el espaciado original (no se reformatea). No importa si la cadena del campo aparece también en algún otro lugar de la línea, que es el problema con la respuesta de daisaa.
Defina una función:
Y utilícelo así:
La salida mantiene todo, incluidos los espacios finales
Funciona bien para archivos donde '/ n' es el separador de registros, por lo que no tiene ese carácter de nueva línea dentro de las líneas. Si desea usarlo con otros separadores de registros, use:
por ejemplo. Funciona bien con casi todos los archivos siempre que no utilicen el número char hexadecimal. 1 dentro de las líneas.
fuente
El siguiente comando awk imprime los últimos N campos de cada línea y al final de la línea imprime un carácter de nueva línea:
Encuentre a continuación un ejemplo que enumera el contenido del directorio / usr / bin y luego contiene las últimas 3 líneas y luego imprime las últimas 4 columnas de cada línea usando awk:
fuente
Primero encuentra la posición del inicio de la tercera columna. Con substr imprimirá la línea completa ($ 0) comenzando en la posición (en este caso a) hasta el final de la línea.
fuente
Bueno, puedes lograr fácilmente el mismo efecto usando una expresión regular. Suponiendo que el separador es un espacio, se vería así:
fuente
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
que quita el patrón dos veces.fuente
Solución Perl:
Se utilizan estas opciones de línea de comandos:
-n
bucle alrededor de cada línea del archivo de entrada, no imprima automáticamente cada línea-l
elimina las nuevas líneas antes del procesamiento y las vuelve a agregar después-a
modo autosplit: divide las líneas de entrada en la matriz @F. Predeterminado para dividir en espacios en blanco-e
ejecutar el código perlsplice @F,0,2
elimina limpiamente las columnas 0 y 1 de la matriz @Fjoin " ",@F
une los elementos de la matriz @F, usando un espacio entre cada elementoSi su archivo de entrada está delimitado por comas, en lugar de por espacios, utilice
-F, -lane
Solución de Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
fuente
Un poco tarde aquí, pero nada de lo anterior pareció funcionar. Intente esto, usando printf, inserta espacios entre cada uno. Elegí no tener una nueva línea al final.
fuente
imprime registros desde el cuarto campo hasta el último campo en el mismo orden en que estaban en el archivo original
fuente
En Bash puede usar la siguiente sintaxis con parámetros posicionales:
Más información: Manejo de parámetros posicionales en Bash Hackers Wiki
fuente
Si solo se trata de ignorar los dos primeros campos y si no desea un espacio al enmascarar esos campos (como lo hacen algunas de las respuestas anteriores):
fuente
Se limpian las dos primeras columnas, se
sed
eliminan los espacios iniciales.fuente
En AWK, las columnas se llaman campos, por lo tanto, NF es la clave
todas las filas:
solo primera fila:
fuente