Como dividir a string quando ela contém símbolos de pipe |
. Eu quero dividi-los para estar na matriz.
eu tentei
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
O que funciona bem. Se minha string for como, "12|23|11"
então, como os divido em uma matriz?
OFS
, coloque vírgulas entre eles, fazendo comprint
que sejam vistos como argumentos separados.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) exclui tudo até (e inclusive) o último ":", mantendo apenas o "11" ... funciona para obter o último número, mas precisaria ser modificado (de uma maneira difícil de ler) para obter o segundo número, etc. awk (e a divisão do awk) é muito mais elegante e legível.cut
Respostas:
Você tentou:
fonte
split
é a expressão regular e|
é um símbolo especial, que precisa ser escapado. Usesplit($0, a, "\|")
|
é visto como um caractere e não como um símbolo especial é colocá-lo entre[]
: ou seja,split($0, a, "[|]")
# eu gosto mais disso do que '\ |', em alguns casos, especialmente como uma variante do regexp ( perl vs grep vs .. outros?) podem ter "|" interpretado literalmente e "\ |" visto como separador de expressões regulares, em vez do oposto ... ymmvPara dividir uma string em uma matriz
awk
, usamos a funçãosplit()
:Se nenhum separador for fornecido, ele usará o
FS
, que assume como padrão o espaço:Podemos dar um separador, por exemplo
:
:O que equivale a defini-lo através do
FS
:No gawk, você também pode fornecer o separador como um regexp:
E até veja o que o delimitador estava em cada etapa usando seu quarto parâmetro:
Vamos citar a página de manual do GNU awk :
fonte
Por favor seja mais específico! O que você quer dizer com "não funciona"? Poste a saída exata (ou mensagem de erro), seu SO e versão do awk:
Ou, usando a divisão:
Edit: no Solaris, você precisará usar o POSIX awk ( / usr / xpg4 / bin / awk ) para processar 4000 campos corretamente.
fonte
for(i = 0
oufor(i = 1
?for (i = 1; i <= n; ++i)
...Não gosto da
echo "..." | awk ...
solução, pois ela chama chamadas desnecessáriasfork
e deexec
sistema.Eu prefiro a solução de Dimitre com um pequeno toque
Ou uma versão um pouco mais curta:
Nesse caso, o registro de saída é uma condição verdadeira, para que seja impresso.
Nesse caso específico, o
stdin
redirecionamento pode ser poupado com a configuração de umawk variável interna:eu usei ksh um bom tempo, mas em festançaisso pode ser gerenciado por manipulação interna de strings. No primeiro caso, a cadeia original é dividida pelo terminador interno. No segundo caso, supõe-se que a sequência sempre contenha pares de dígitos separados por um separador de um caractere.
O resultado em todos os casos é
fonte
bash
expressão ...Na verdade,
awk
possui um recurso chamado link 'Input Field Separator Variable' . Isto é como usá-lo. Não é realmente uma matriz, mas usa as variáveis $ internas. Para dividir uma string simples, é mais fácil.fonte
Deveria trabalhar.
fonte
fonte
Piada? :)
E se
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Esta é a minha saída:
então eu acho que está funcionando depois de tudo ..
fonte
Sei que essa é uma pergunta antiga, mas pensei que talvez alguém gostasse do meu truque. Especialmente porque essa solução não se limita a um número específico de itens.
A saída será:
fonte