Respostas:
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 -F"," ...
- seria separado por vírgulas (ie ,).cut -d"," ...
- separaria por vírgulas (ie ,).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.
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.
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,.
Um campo de acordo com o POSIX é qualquer parte de uma linha delimitada por qualquer um dos caracteres IFS
do " 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.
cut
qual foi feita a pergunta.
cut -d "$IFS"
será erro, enquanto que awk -F"[ \t\n]"
obras como esperado
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, 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 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 sort
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 para sort
definir os campos 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.
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 estiverem separados por dois pontos nas linhas, você poderá combinar -d
e -f
obter campos (ou colunas) 2, 3 e 6 como este:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Quando você usa o cut
comando, 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 output
seria 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
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}'
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 sort
são difíceis de descobrir! Os campos em join
parecem funcionar da mesma forma que em cut
, embora join
seja fácil errar nas opções.
echo '$IFS' | cat -vet
para ver como é o valor padrão noshell
.