
Por exemplo, o cut
comando pode receber um parâmetro -f, que de acordo comman
selecione apenas esses campos; também imprima qualquer linha que não contenha nenhum caractere delimitador, a menos que a opção -s seja especificada
Neste contexto, o que é um campo?
Responder1
O termo "campo" é frequentemente 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 Space.
No entanto, como acontece com a maioria das ferramentas, é configurável. Por exemplo:
- awk =
awk -F"," ...
- seria separado por vírgulas (ou seja ,,). - cut =
cut -d"," ...
- seria separado 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 cut
será dividido em espaços também.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Aqui temos uma lista CSV de dados de coluna que estamos usando cut
para retornar as colunas 1 e 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
Awk também é um pouco mais hábil em lidar com uma variedade de personagens de separação. Aqui está lidando Tabscom Spacesonde eles são 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, basta dizer cut
para não imprimir nenhuma linha que não contenha o caractere delimitador especificado por meio da -d
opção.
Exemplo
Digamos que tivéssemos esse arquivo.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
OBSERVAÇÃO:Existem espaços e tabulações na segunda string acima.
Agora, quando processamos essas strings usando cut
com e sem o -s
switch:
$ 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 -s
opção omitiu quaisquer strings da saída que não contenham o delimitador, Space.
Responder2
Um campo de acordo com POSIX é qualquer parte de uma linha delimitada por qualquer um dos caracteres emIFS
, o "separador de campo de entrada(ouseparador de campo interno)." O valor padrão é espaço, seguido por uma tabulação horizontal, seguida por uma nova linha. Com o Bash você pode executar printf '%q\n' "$IFS"
para ver seu valor.
Responder3
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 aba. O segundo campo vai do caractere após a primeira aba até a próxima aba. E assim por diante para o terceiro, quarto, ... Tudo entre tabulações, ou entre início de linha e tabulação, ou entre tabulação e fim de linha.
A menos que você especifique um delimitador de campo com a opção "-d": cut -d: -f2
obteria 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
é uma boa alternativa se cut
for muito rigoroso, pois awk
divide 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 página de manual atual sort
diz algo como "transição de não-branco para branco" para um separador de campo. Por alguma razão, são necessárias algumas tentativas para sort
definir os campos corretamente. join
aparentemente usa campos "delimitados por espaços em branco", que é o que awk
pretende fazer por padrão.
A moral da história é ter cuidado e experimentar se não souber.
Responder4
Quando você usa cut
o comando, são necessários dois argumentos principais
-d: que significa delimitador
-f: que significa campo a ser cortado do arquivo de entrada
Ex. cut - d "|" - f1, 2 input_filename
Aqui o output
seria separado pelo delimitador "|" e cortará apenas 2 campos do arquivo de entrada
Se você tiver as seguintes linhas em seu arquivo
Alex|120000|Admin|1999
Então ele cortará 2 campos que são
Alex|120000