O parâmetro delimiter no comando cut, sempre espera que esteja entre uma string?

1

Eu observei algo com o comando cut de hoje, que de alguma forma eu nunca havia notado antes, apesar de estar usando e trabalhando com eles por um longo tempo.

Da string /users/developer/ , eu queria extrair users . Então, o que eu fiz foi

echo 'pwd' | cut -d '/' -f1

Isso não estava me devolvendo nada. Minha suposição era, desde que eu tinha especificado / como um delimitador, deveria ter me retornado o primeiro campo após o delimitador ser encontrado.

Depois de alguns ajustes, percebi que posso obter minha saída desejada, quando mudo meu comando para recuperar f2

echo 'pwd' | cut -d '/' -f2

Isso levou-me a pensar, que delimitador sempre espera algo para estar no lado esquerdo dela, e é por isso que, na tentativa de recuperar o primeiro campo, não foi me devolver nada, e quando tentei recuperar o segundo campo, consegui o que estava esperando.

Logicamente, faz sentido para um delimiter . Eu só queria saber, é assim que o parâmetro delimitador funciona no comando cut? Em outras palavras, minha inferência é correta (esse delimitador sempre espera que algo esteja à esquerda do delimitador)

    
por Incognito 10.05.2013 / 13:47

3 respostas

3

f1 está vazio, como no que está antes do primeiro / .

 echo "/some/path/to/some/location" | cut -d '/' -f1
      |
      +--- empty

f1 é o que está entre echo " e primeiro / .

Para colocar de outra forma: vazio não é inexistente. Ou uma string / campo não pode ter caracteres como em "" .

Talvez seja mais claro se, por exemplo, você olha algo assim:

[In Data]   [Output fields]
             1  2  3  4  5 -f
A:B::D:E  => A, B,  , D, E
A::C:D:E  => A,  , C, D, E
:B:C:D:   =>  , B, C, D, 

Esquerda, entre , ou direita - vazia ou não. Um campo é um campo.

    
por 10.05.2013 / 15:06
1

Não há nada na página man nem em info para corroborar explicitamente isso, mas

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

que sugere que o primeiro campo é ANTES do primeiro delimitador (mesmo que esse delimitador não exista).

Para mim, nunca tive dúvidas de que funcionou assim, mas esse pode não ser o tipo de resposta que você precisa; -).

    
por 10.05.2013 / 14:29
1

A definição parece bastante clara sobre isso. Veja o artigo da wikipedia sobre Delimiter .

A delimiter is a sequence of one or more characters used to specify the boundary between separate, independent regions in plain text or other data streams.1 An example of a delimiter is the comma character, which acts as a field delimiter in a sequence of comma-separated values.

Delimiters represent one of various means to specify boundaries in a data stream. Declarative notation, for example, is an alternate method that uses a length field at the start of a data stream to specify the number of characters that the data stream contains.

Ele diz isso logo na primeira sentença, "..especifique o limite entre regiões separadas e independentes ...". Eu diria que isso significa exatamente como você inferiu.

    
por 10.05.2013 / 15:05

Tags