¿Qué constituye un "campo" para el comando de corte?

16

Por ejemplo, el cutcomando puede tomar un parámetro -f, que segúnman

seleccione solo estos campos; también imprima cualquier línea que no contenga caracteres delimitadores, a menos que se especifique la opción -s

En este contexto, ¿qué es un campo?

luca590
fuente

Respuestas:

19

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 = 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 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.

¿Qué pasa con el interruptor -s para cortar?

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.

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 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.

slm
fuente
8

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.

l0b0
fuente
Haga una echo '$IFS' | cat -vet para ver cómo se ve el valor predeterminado en shell.
C0deDaedalus
1
IFS es utilizado por el shell para la mayoría de los propósitos (no todos), pero no por otros programas y específicamente no por cutcuál fue la pregunta formulada.
dave_thompson_085
A diferencia de awk, cut también admite solo un delimitador a la vez, por lo que cut -d "$IFS"será un error, mientras que awk -F"[ \t\n]"funciona como se esperaba
JGurtz
2

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.

Bruce Ediger
fuente
2

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
Volker Siegel
fuente
1

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
Shah Honey
fuente
Su ejemplo está completamente roto debido a espacios incorrectos, e incluso si es correcto, esto no agrega nada a las respuestas dadas hace 4 años.
dave_thompson_085
0

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.

Laurence Renshaw
fuente