O termo "campo" costuma ser associado a ferramentas como cut
e 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 awk
automaticamente irá dividir 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 da coluna que estamos usando cut
para 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 cut
não imprimir nenhuma linha que não contenha o caractere delimitador especificado por essa -d
opçã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 cut
com e sem a -s
opçã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 -s
opção omitiu qualquer sequência da saída que não contenha o delimitador Space,.
echo '$IFS' | cat -vet
para ver como é o valor padrão noshell
.cut
qual foi feita a pergunta.cut -d "$IFS"
será erro, enquanto queawk -F"[ \t\n]"
obras como esperadoDepende 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, 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: -f2
você 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 secut
for muito rigoroso, poisawk
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 comawk
:sort
é quem me engana. Minhasort
pá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 parasort
definir os campos corretamente.join
aparentemente usa campos "delimitados por espaço em branco", que é o queawk
pretende fazer por padrão.A moral da história é ter cuidado e experimentar, se você não souber.
fonte
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 quesort
.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
-d
e-f
obter campos (ou colunas) 2, 3 e 6 como este:fonte
Quando você usa o
cut
comando, são necessários dois argumentos principaisAqui o
output
seria separado pelo delimitador "|" e ele cortará apenas 2 campos do arquivo de entradaSe você possui as seguintes linhas no seu arquivo
Então ele cortará 2 campos que são
fonte
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
).awk
as 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 (awk
padrã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}'
ouls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
são muito simples, mas seria difícil fazer issocut
.Concordo com os pôsteres anteriores de que os campos / chaves
sort
são difíceis de descobrir! Os campos emjoin
parecem funcionar da mesma forma que emcut
, emborajoin
seja fácil errar nas opções.fonte