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 usando un carácter específico. Normalmente, el carácter utilizado para hacer esto es un Espacio .
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, , ). - cortar =
cut -d"," ...
- se separaría por comas (es decir, , ).
Ejemplos
Este primero muestra cómo awk
se dividirá automáticamente en espacios.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Este muestra cómo cut
también se dividirá en espacios.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Aquí tenemos una lista CSV de datos de columna que estamos usando 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 hábil para lidiar con una variedad de personajes separados. Aquí se trata de Pestañas junto con Espacios donde se entremezclan 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, simplemente le dice a cut
para no imprimir ninguna línea que no contenga el carácter delimitador especificado a través del -d
cambiar.
Ejemplo
Digamos que teníamos este archivo.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
Ahora, cuando procesamos estas cadenas usando cut
con y sin el -s
cambiar:
$ 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 puedes ver que el -s
switch ha omitido cualquier cadena de la salida que no contenga el delimitador, Espacio .
Un campo según POSIX es cualquier parte de una línea delimitada por cualquiera de los caracteres en IFS
, el "separador de campo de entrada (o separador de campo interno )." El valor predeterminado de esto es espacio, seguido de un tabulador horizontal, seguido de una nueva línea. Con Bash puede ejecutar printf '%q\n' "$IFS"
para ver su valor.
Depende de la utilidad en cuestión, pero para cut
, un "campo" comienza al principio de una línea de texto e incluye todo hasta la primera pestaña. El segundo campo va desde el carácter después de la primera pestaña, hasta la siguiente pestaña. Y así sucesivamente para el tercero, cuarto, ... Todo entre tabulaciones, o entre el inicio de la línea y la tabulación, o entre la tabulación y el final de la línea.
A menos que especifique un delimitador de campo con la opción "-d":cut -d: -f2
obtendría todo entre el primer y el segundo carácter de dos puntos (':').
Otras utilidades tienen definiciones diferentes, pero un carácter de tabulación es común. awk
es una buena alternativa si cut
es demasiado estricto, como awk
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 tienes que saber un poco de sintaxis. Para imprimir el segundo campo según awk
:
awk '{print $2}'
sort
es el que me engaña. Mi sort
actual La página de manual dice algo así como "transición de no en blanco a en blanco" para un separador de campo. Por alguna razón, toma algunos intentos para obtener sort
campos definidos correctamente. join
aparentemente usa campos "delimitados por espacios en blanco", que es lo que awk
pretende hacer por defecto.
La moraleja de la historia es tener cuidado y experimentar si no sabes.