Respuestas:
El término "campo" a menudo se asocia con herramientas como cuty 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 -F"," ...- se separaría por comas (es decir ,).cut -d"," ...- se separaría por comas (es decir ,).Este primero muestra cómo awkse dividirá automáticamente en los espacios.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Este muestra cómo cutse 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 cutpara 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.
Con respecto a este interruptor, es simplemente decirle cutque no imprima ninguna línea que no contenga el carácter delimitador especificado a través del -dinterruptor.
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 cutcon y sin el -sinterruptor:
$ 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 -sinterruptor ha omitido ningún tipo de condiciones de la salida que no contienen el delimitador, Space.
Un campo según POSIX es cualquier parte de una línea delimitada por cualquiera de los caracteres en IFSel " 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 puedes correr printf '%q\n' "$IFS"para ver su valor.
cutcuál fue la pregunta formulada.
cut -d "$IFS"será un error, mientras que awk -F"[ \t\n]"funciona como se esperaba
Depende 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. awkes un buen retroceso si cutes demasiado estricto, ya que awkdivide 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 con awk:
awk '{print $2}'
sortEs el que me engaña. Mi sortpá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 para sortdefinir correctamente los campos. joinaparentemente usa campos "delimitados por espacios en blanco", que es lo que awkpretende hacer por defecto.
La moraleja de la historia es tener cuidado y experimentar si no lo sabes.
El término "campo" no está relacionado con Linux en general, sino con programas específicos. Entonces cutusa un tipo diferente de campo que sort.
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 -dy -fobtener los campos (o columnas) 2, 3 y 6 de esta manera:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Cuando usa el cutcomando, se necesitan dos argumentos principales
-d: que significa delimitador
-f: qué significa campo que se cortará del archivo de entrada
Ex. cut - d "|" - f1, 2 input_filename
Aquí el outputestaría separado por delimitador "|" y cortará solo 2 campos del archivo de entrada
Si tiene las siguientes líneas en su archivo
Alex|120000|Admin|1999
Luego cortará 2 campos que son
Alex|120000
cutes 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).
awklas líneas simples son mucho más flexibles, por ejemplo, cuando el separador de campo de entrada puede ser cualquier espacio en blanco ( awkpredeterminado), o cuando desea generar campos en un orden diferente o con un formato particular.
Por ejemplo, wc -l myfile | awk '{print $1}'o ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'son muy simples, pero sería difícil hacerlo cut.
¡Estoy de acuerdo con los carteles anteriores de que los campos / claves sortson difíciles de entender! Los campos en joinparecen funcionar igual que en cut, aunque las joinopciones son fáciles de equivocar.
echo '$IFS' | cat -vetpara ver cómo se ve el valor predeterminado enshell.