Necesito ayuda para descubrir cómo usar el comando sed para mostrar solo la primera columna y la última columna en un archivo de texto. Esto es lo que tengo hasta ahora para la columna 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Mi débil intento de mostrar también la última columna fue:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Sin embargo, esto toma la primera columna y la última columna y las combina en una sola lista. ¿Hay alguna manera de imprimir la primera columna y las últimas columnas claramente con los comandos sed y awk?
Entrada de muestra:
foo|dog|cat|mouse|lion|ox|tiger|bar
Respuestas:
Casi ahi. Simplemente ponga ambas referencias de columna una al lado de la otra.
También tenga en cuenta que no necesita
cat
aquí.También tenga en cuenta que puede decir
awk
que los separadores de columna son|
, en lugar de espacios en blanco, por lo que tampoco necesitased
.Según las sugerencias de Caleb , si desea una solución que aún genere el último campo, incluso si no hay exactamente ocho, puede usarla
$NF
.Además, si desea que la salida retenga los
|
separadores, en lugar de usar un espacio, puede especificar los separadores de campo de salida. Desafortunadamente, es un poco más torpe que solo usar la-F
bandera, pero aquí hay tres enfoques.Puede asignar los separadores de campo de entrada y salida en
awk
sí mismo, en el bloque COMENZAR.Puede asignar estas variables al llamar
awk
desde la línea de comando, a través de la-v
bandera.o simplemente:
fuente
|
como un separador de salida en lugar del espacio predeterminado para la concatenación de cadenas. También podría explicar el uso en$NF
lugar de la codificación rígida$8
para obtener la última columna.Simplemente reemplace del primero al último
|
con un|
(o espacio si lo prefiere):Tenga en cuenta que aunque no hay
sed
implementación donde|
sea especial (siempre y cuando las expresiones regulares extendidas no estén habilitadas a través de-E
o-r
en algunas implementaciones),\|
sí es especial en algunos como GNUsed
. Por lo que debe no escapar|
si tiene la intención para que coincida con el|
personaje.Si se reemplaza con espacio y si la entrada ya puede contener líneas con solo una
|
, entonces, tendrá que tratar eso especialmente, ya|.*|
que no coincidirá con ellas. Eso podria ser:(es decir, hacer la
.*|
parte opcional) O:o:
Si desea los campos primero y octavo independientemente del número de campos en la entrada, entonces es solo:
(todos estos funcionarían con cualquier utilidad compatible con POSIX suponiendo que la entrada forme texto válido (en particular, los
sed
que generalmente no funcionarán si la entrada tiene bytes o secuencias de bytes que no forman caracteres válidos en el entorno local actual, como por ejemploprintf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
en un entorno local UTF-8)).fuente
Estás utilizando de
awk
todos modos:fuente
|
más bien ese espacio) con-F\|
o similar? Además, ¿qué pasaría si quisiera usar el mismo delimitador para la salida?Si te encuentras awk y sed-less, puedes lograr lo mismo con coreutils:
fuente
cut
es más limpio y más compacto que awk / sed cuando solo está interesado en la primera columna, o si los delimitadores son fijos (es decir, no hay un número variable de espacios).Parece que intenta obtener el primer y el último campo de texto delimitados por
|
.Supuse que su archivo de registro contiene el texto que se muestra a continuación,
Y quieres la salida como,
En caso afirmativo, aquí viene el comando para su
A través de GNU sed,
Ejemplo:
fuente
Probablemente deberías hacerlo con
sed
, de todos modos, pero solo porque nadie ha escrito este todavía:SALIDA
fuente