O que constitui um 'campo' para o comando de corte?

16

Por exemplo, o comando cut pode pegar um parâmetro -f, que de acordo com man

select only these fields; also print any line that contains no delimiter character, unless the -s option is specified

Neste contexto, o que é um campo?

    
por luca590 29.03.2014 / 02:11

6 respostas

19

O termo "campo" geralmente é associado a ferramentas como cut e awk . Um campo seria semelhante a uma coluna de dados, se você pegar os dados e separá-los usando um caractere específico. Normalmente, o caractere usado para fazer isso é um Espaço .

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

  • awk = awk -F"," ... - separaria por vírgulas (ou seja, , ).
  • cut = cut -d"," ... - separaria por vírgulas (ou seja, , ).

Exemplos

Este primeiro mostra como awk será automaticamente dividido em espaços.

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

Este mostra como o cut também será dividido em espaços.

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

Aqui temos uma lista de dados da coluna CSV que estamos usando cut para retornar as colunas 1 & 4.

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

Awk também pode fazer isso:

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

O Awk também é um pouco mais apto a lidar com uma variedade de caracteres de separação. Aqui está lidando com Tabs junto com Espaços onde eles estão misturados ao mesmo tempo:

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

E o interruptor -s para cortar?

Com relação a essa opção, ele simplesmente informa cut para não imprimir nenhuma linha que não contenha o caractere delimitador especificado por meio da opção -d .

Exemplo

Digamos que tenhamos 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 segunda cadeia acima.

Agora, quando processamos essas sequências usando cut com e sem a opção -s :

$ 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 opção -s omitiu todas as strings da saída que não contêm o delimitador, Espaço .

    
por 29.03.2014 / 03:56
8

Um campo de acordo com POSIX é qualquer parte de uma linha delimitada por qualquer um dos caracteres em IFS , o " separador de campos de entrada (ou separador de campos internos ) . "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.

    
por 29.03.2014 / 11:21
2

Depende do utilitário em questão, mas para cut , um "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, em terceiro, quarto, ... 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: -f2 obterá tudo entre os caracteres de primeiro e segundo pontos de cólon (':').

Outros utilitários têm definições diferentes, mas um caractere de tabulação é comum. awk é uma boa alternativa se cut for muito rigoroso, pois awk divide 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 da sintaxe. Para imprimir o segundo campo de acordo com awk :

awk '{print $2}'

sort é o que me engana. Minha atual página sort man diz algo como "não em branco para transição em branco" para um separador de campo. Por algum motivo, são necessárias algumas tentativas para obter campos sort definidos corretamente. join aparentemente usa campos "delimitados por espaço em branco", que é o que awk pretende fazer por padrão.

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

    
por 29.03.2014 / 02:29
2

O termo "campo" não está relacionado ao linux em geral, mas a programas específicos. Então cut usa 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 forem separados por dois pontos nas linhas, você poderá combinar -d e -f para obter campos (ou colunas) 2, 3 e 6 assim:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
    
por 29.03.2014 / 02:32
1

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

-d : which stand for delimiter

-f : which stand for field to be cut from the input file

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

Aqui, o output seria separado pelo delimitador "|" e vai cortar apenas 2 campos do arquivo de entrada

Se você tem as seguintes linhas no seu arquivo

Alex|120000|Admin|1999

Depois, cortará 2 campos que são

Alex|120000
    
por 29.04.2018 / 07:49
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 se eu especificar -f3,2,1 , ele age da mesma forma que -f1,2,3 ).

awk one-liners são muito mais flexíveis, por ex. quando o separador do campo de entrada pode ser qualquer espaço em branco ( awk padrão) ou quando você deseja produzir 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 com cut .

Concordo com os pôsteres anteriores de que os campos / chaves em sort são difíceis de descobrir! Os campos em join parecem funcionar da mesma forma que em cut , embora as opções join sejam fáceis de serem erradas.

    
por 04.04.2014 / 05:28

Tags