El término "campo" a menudo se asocia con herramientas como cut
y awk
. Un campo sería similar a una columna de datos, si toma los datos y los separa con un carácter específico. Por lo general, el personaje utilizado para hacer esto es a Space.
Sin embargo, como es el caso con la mayoría de las herramientas, es configurable. Por ejemplo:
- awk =
awk -F"," ...
- se separaría por comas (es decir ,).
- cut =
cut -d"," ...
- se separaría por comas (es decir ,).
Ejemplos
Este primero muestra cómo awk
se dividirá automáticamente en los espacios.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Este muestra cómo cut
se dividirá en espacios también.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Aquí tenemos una lista CSV de datos de columna que estamos utilizando cut
para devolver las columnas 1 y 4.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awk también puede hacer esto:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk también es un poco más experto en tratar con una variedad de personajes de separación. Aquí se trata Tabsjunto con Spacesdónde se mezclan al mismo tiempo:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
¿Qué pasa con el interruptor -s para cortar?
Con respecto a este interruptor, es simplemente decirle cut
que no imprima ninguna línea que no contenga el carácter delimitador especificado a través del -d
interruptor.
Ejemplo
Digamos que teníamos este archivo.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
NOTA: Hay espacios y pestañas en la segunda cadena de arriba.
Ahora cuando procesamos estas cadenas usando cut
con y sin el -s
interruptor:
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
En el segundo ejemplo se puede ver que el -s
interruptor ha omitido ningún tipo de condiciones de la salida que no contienen el delimitador, Space.
echo '$IFS' | cat -vet
para ver cómo se ve el valor predeterminado enshell
.cut
cuál fue la pregunta formulada.cut -d "$IFS"
será un error, mientras queawk -F"[ \t\n]"
funciona como se esperabaDepende de la utilidad en cuestión, pero para
cut
, un "campo" comienza al comienzo de una línea de texto e incluye todo hasta la primera pestaña. El segundo campo va desde el personaje después de la primera pestaña, hasta la siguiente pestaña. Y así sucesivamente para el tercero, cuarto, ... Todo entre pestañas, o entre el inicio de la línea y la pestaña, o entre la pestaña y el final de la línea.A menos que especifique un delimitador de campo con la opción "-d":
cut -d: -f2
obtendrá todo entre el primer y el segundo carácter de dos puntos (':').Otras utilidades tienen diferentes definiciones, pero un carácter de tabulación es común.
awk
es un buen retroceso sicut
es demasiado estricto, ya queawk
divide los campos en función de uno o más caracteres de espacio en blanco. Eso es un poco más natural en muchas situaciones, pero hay que saber un poco de sintaxis. Para imprimir el segundo campo de acuerdo conawk
:sort
Es el que me engaña. Misort
página de manual actual dice algo así como "transición de blanco a blanco" para un separador de campo. Por alguna razón, se requieren algunos intentos parasort
definir correctamente los campos.join
aparentemente usa campos "delimitados por espacios en blanco", que es lo queawk
pretende hacer por defecto.La moraleja de la historia es tener cuidado y experimentar si no lo sabes.
fuente
El término "campo" no está relacionado con Linux en general, sino con programas específicos. Entonces
cut
usa un tipo diferente de campo quesort
.Con
cut
, usted define qué es un campo usted mismo, especificando un delimitador de campo con la opción -d, que separa los campos en cada línea.Si sus datos están separados por dos puntos en las líneas, puede combinar
-d
y-f
obtener los campos (o columnas) 2, 3 y 6 de esta manera:fuente
Cuando usa el
cut
comando, se necesitan dos argumentos principalesAquí el
output
estaría separado por delimitador "|" y cortará solo 2 campos del archivo de entradaSi tiene las siguientes líneas en su archivo
Luego cortará 2 campos que son
fuente
cut
es ideal para casos simples, donde el delimitador es un solo carácter y desea generar un subconjunto de los campos de entrada, en el mismo orden (incluso si lo especifico-f3,2,1
, actúa igual que-f1,2,3
).awk
las líneas simples son mucho más flexibles, por ejemplo, cuando el separador de campo de entrada puede ser cualquier espacio en blanco (awk
predeterminado), o cuando desea generar campos en un orden diferente o con un formato particular.Por ejemplo,
wc -l myfile | awk '{print $1}'
ols -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
son muy simples, pero sería difícil hacerlocut
.¡Estoy de acuerdo con los carteles anteriores de que los campos / claves
sort
son difíciles de entender! Los campos enjoin
parecen funcionar igual que encut
, aunque lasjoin
opciones son fáciles de equivocar.fuente