Respuestas:
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 -F"," ...
- se separaría por comas (es decir ,).cut -d"," ...
- se separaría por comas (es decir ,).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.
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.
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.
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 puedes correr printf '%q\n' "$IFS"
para ver su valor.
cut
cuá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. awk
es un buen retroceso si cut
es demasiado estricto, ya que 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 hay que saber un poco de sintaxis. Para imprimir el segundo campo de acuerdo con awk
:
awk '{print $2}'
sort
Es el que me engaña. Mi sort
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 para sort
definir correctamente los campos. 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 lo sabes.
El término "campo" no está relacionado con Linux en general, sino con programas específicos. Entonces cut
usa 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 -d
y -f
obtener 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 cut
comando, 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 output
estarí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
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}'
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 sort
son difíciles de entender! Los campos en join
parecen funcionar igual que en cut
, aunque las join
opciones son fáciles de equivocar.
echo '$IFS' | cat -vet
para ver cómo se ve el valor predeterminado enshell
.