Dado o seguinte comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
por que o awk output:
1:
Dado o seguinte comando:
echo "1: " | awk '/1/ -F ":" {print $1}'
por que o awk output:
1:
Respostas:
"-F" é um argumento de linha de comando que não é sintaxe do awk, tente:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Se pattern
(principalmente uma declaração condicional) for verdadeira , action
será executada. Se pattern
não estiver disponível, true
está implícito. Aqui pattern
está o /1/
que estados é regex 1
correspondido no registro atual$0
Se você quiser fazer isso programaticamente, poderá usar a FS
variável:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Observe que, se você o alterar no loop principal, e não no BEGIN
loop, isso afetará a próxima linha lida, pois a linha atual já foi dividida.
Você tem várias maneiras de definir :
como separador:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Todos eles são equivalentes e, para um, retornará 1
para uma entrada de amostra "1: 2: 3":
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
instrução seja o mais correto (sendo consistente com a awk
sintaxe geral ).
BEGIN
se eu usar um arquivo para armazenar a coisa toda, enquanto -F
é útil com one-liners.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
eawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Não há necessidade de escrever isso. Basta colocar o separador de campos desejado com a opção -F no comando awk e o número da coluna que você deseja imprimir segregado conforme o separador de campos mencionado.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
O AWK funciona como intérprete de texto que segue a linha em todo o documento e segue em campo para cada linha, portanto, $ 1, $ 2 .. $ n são referências aos campos de cada linha ($ 1 é o primeiro campo, $ 2 é o segundo campo e assim por diante ...) Você pode definir um separador de campos usando a opção "-F" na linha de comando ou entre dois colchetes com "FS = ...". Agora considere a resposta de "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Acima dos limites do campo são definidos por ":", então temos dois campos $ 1, que é "1" e $ 2, que é o espaço vazio. Depois, vem a expressão regular "/ 1 /" que instrui o filtro a exibir apenas o primeiro campo quando o intérprete se depara com uma linha que contém essa expressão (quero dizer 1); A saída do comando "echo" é uma linha que contém "1" para que o filtro funcione ...
Ao lidar com o seguinte exemplo:
echo "1: " | awk '/1/ -F ":" {print $1}'
A sintaxe é confusa e o intérprete optou por ignorar a parte F ":" e alterna para o divisor de campo padrão, que é o espaço vazio, gerando "1:" como o primeiro campo e não haverá um segundo campo!
A resposta de JUERGEN contém a boa sintaxe ...