A pergunta do ignorante aqui: a parte / 1 / é para o awk processar apenas linhas (ou registros para ser mais preciso) que contenham o número 1, certo?
rantsh
3
Parece que a sintaxe do @rantsh Awk (pattern){action}. Se pattern(principalmente uma declaração condicional) for verdadeira , actionserá executada. Se patternnão estiver disponível, trueestá implícito. Aqui patternestá o /1/que estados é regex 1correspondido no registro atual$0
kvantour
62
Se você quiser fazer isso programaticamente, poderá usar a FSvariável:
qual é a maneira preferida? Presumo que o exemplo final com a BEGINinstrução seja o mais correto (sendo consistente com a awksintaxe geral ).
1
@randomware todos eles estão bem. Eu costumo usar BEGINse eu usar um arquivo para armazenar a coisa toda, enquanto -Fé útil com one-liners.
fedorqui 'Então, pare de prejudicar' 01/06/19
1
Deve-se dizer que existem diferenças sutis entre o terceiro caso e todos os outros. Exemplo: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileeawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Você também pode usar uma regex como um separador de campos; o seguinte imprimirá "barra" usando uma regex para definir o número "10" como um separador.
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.
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!
(pattern){action}
. Sepattern
(principalmente uma declaração condicional) for verdadeira ,action
será executada. Sepattern
não estiver disponível,true
está implícito. Aquipattern
está o/1/
que estados é regex1
correspondido no registro atual$0
Se você quiser fazer isso programaticamente, poderá usar a
FS
variável: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.fonte
Você tem várias maneiras de definir
:
como separador:Todos eles são equivalentes e, para um, retornará
1
para uma entrada de amostra "1: 2: 3":fonte
BEGIN
instrução seja o mais correto (sendo consistente com aawk
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
-F
é um argumento paraawk
si mesmo:fonte
Você também pode usar uma regex como um separador de campos; o seguinte imprimirá "barra" usando uma regex para definir o número "10" como um separador.
fonte
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.
fonte
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":
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:
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 ...
fonte
Ou você pode usar:
Esta é uma equação realmente engraçada.
fonte
/1/
significa