O que constitui um 'campo' para o comando cut?

16

Por exemplo, o cutcomando pode usar um parâmetro -f, que de acordo comman

selecione apenas esses campos; imprima também qualquer linha que não contenha caracteres delimitadores, a menos que a opção -s seja especificada

Nesse contexto, o que é um campo?

luca590
fonte

Respostas:

19

O termo "campo" costuma ser associado a ferramentas como cute awk. Um campo seria semelhante a uma coluna de dados, se você os coletar e separar usando um caractere específico. Normalmente, o caractere usado para fazer isso é a Space.

No entanto, como é o caso da maioria das ferramentas, é configurável. Por exemplo:

  • awk = awk -F"," ...- seria separado por vírgulas (ie ,).
  • cut = cut -d"," ...- separaria por vírgulas (ie ,).

Exemplos

Este primeiro mostra uma como awkautomaticamente irá dividir em espaços.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Este mostra como cutserá dividido em espaços também.

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Aqui temos uma lista CSV de dados da coluna que estamos usando cutpara retornar as colunas 1 e 4.

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

O Awk também pode fazer isso:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk também é um pouco mais hábil em lidar com uma variedade de caracteres de separação. Aqui está lidando Tabsjuntamente com Spacesonde eles estão inter-misturados ao mesmo tempo:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

E a opção -s para cortar?

Com relação a essa opção, é simplesmente recomendável cutnão imprimir nenhuma linha que não contenha o caractere delimitador especificado por essa -dopção.

Exemplo

Digamos que tivemos este arquivo.

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

NOTA: Existem espaços e tabulações na 2ª sequência acima.

Agora, quando processamos essas strings usando cutcom e sem a -sopção:

$ 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  

No segundo exemplo, você pode ver que a -sopção omitiu qualquer sequência da saída que não contenha o delimitador Space,.

slm
fonte
8

Um campo de acordo com o POSIX é qualquer parte de uma linha delimitada por qualquer um dos caracteres IFSdo " separador de campo de entrada (ou separador de campo interno ) " . O valor padrão disso é espaço, seguido por um tabulador horizontal seguido por uma nova linha . Com o Bash, você pode executar printf '%q\n' "$IFS"para ver seu valor.

l0b0
fonte
Faça um echo '$IFS' | cat -vet para ver como é o valor padrão no shell.
C0deDaedalus 28/04
11
O IFS é usado pelo shell para a maioria dos propósitos (não todos), mas não por outros programas e, especificamente, não pelo cutqual foi feita a pergunta.
Dave_thompson_085
Ao contrário de awk, cut também suporta apenas um delimitador de cada vez, então cut -d "$IFS"será erro, enquanto que awk -F"[ \t\n]"obras como esperado
JGurtz
2

Depende do utilitário em questão, mas para cutum "campo" começa no início de uma linha de texto e inclui tudo, até a primeira guia. O segundo campo é executado a partir do caractere após a primeira guia, até a próxima guia. E assim por diante, na terceira, quarta, ... Tudo entre as guias, ou entre o início da linha e a guia, ou entre a guia e o final da linha.

A menos que você especifique um delimitador de campo com a opção "-d": cut -d: -f2você obterá tudo entre o primeiro e o segundo caracteres de dois pontos (':').

Outros utilitários têm definições diferentes, mas um caractere de tabulação é comum. awké um bom retorno se cutfor muito rigoroso, pois awkdivide os campos com base em um ou mais caracteres de espaço em branco. Isso é um pouco mais natural em muitas situações, mas você precisa conhecer um pouco de sintaxe. Para imprimir o segundo campo de acordo com awk:

awk '{print $2}'

sorté quem me engana. Minha sortpágina de manual atual diz algo como "transição não em branco para em branco" para um separador de campo. Por alguma razão, são necessárias algumas tentativas para sortdefinir os campos corretamente. joinaparentemente usa campos "delimitados por espaço em branco", que é o que awkpretende fazer por padrão.

A moral da história é ter cuidado e experimentar, se você não souber.

Bruce Ediger
fonte
2

O termo "campo" não está relacionado ao linux em geral, mas a programas específicos. Então, cutusa um tipo diferente de campo que sort.

Com cut, você define o que é um campo, especificando um delimitador de campo com a opção -d, que separa os campos em cada linha.

Se seus dados estiverem separados por dois pontos nas linhas, você poderá combinar -de -fobter campos (ou colunas) 2, 3 e 6 como este:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Volker Siegel
fonte
1

Quando você usa o cutcomando, são necessários dois argumentos principais

-d: que significa delimitador

-f: significa o campo a ser cortado do arquivo de entrada

Ex. cut - d "|"  - f1, 2 input_filename

Aqui o outputseria separado pelo delimitador "|" e ele cortará apenas 2 campos do arquivo de entrada

Se você possui as seguintes linhas no seu arquivo

Alex|120000|Admin|1999

Então ele cortará 2 campos que são

Alex|120000
Shah Honey
fonte
Seu exemplo está completamente quebrado devido a espaços incorretos e, mesmo que correto, isso não adiciona nada às respostas dadas quatro anos atrás.
Dave_thompson_085 29/04
0

cuté ótimo para casos simples, em que o delimitador é um único caractere e você deseja gerar um subconjunto dos campos de entrada, na mesma ordem (mesmo que eu especifique -f3,2,1, ele age da mesma maneira -f1,2,3).

awkas linhas de linha são muito mais flexíveis, por exemplo, quando o separador de campos de entrada pode ser qualquer espaço em branco ( awkpadrão), ou quando você deseja exibir campos em uma ordem diferente ou com um formato específico.

Por exemplo, wc -l myfile | awk '{print $1}'ou ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'são muito simples, mas seria difícil fazer isso cut.

Concordo com os pôsteres anteriores de que os campos / chaves sortsão difíceis de descobrir! Os campos em joinparecem funcionar da mesma forma que em cut, embora joinseja fácil errar nas opções.

Laurence Renshaw
fonte