Cómo dividir la cadena cuando contiene símbolos de tubería |
en ella. Quiero dividirlos para que estén en la matriz.
Lo intenté
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Que funciona bien. Si mi cadena es así "12|23|11"
, ¿cómo los divido en una matriz?
OFS
, pegue comas entre ellos, haciéndolosprint
ver como argumentos separados.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) elimina todo hasta (e incluye) el último ":", manteniendo solo el "11" ... funciona para obtener el último número, pero necesitaría ser modificado (de una manera difícil de leer) para obtener el segundo número, etc. awk (y la división de awk) es mucho más elegante y legible.cut
Respuestas:
Has probado:
fuente
split
es expresión regular, y|
es un símbolo especial, que necesita ser escapado. Usosplit($0, a, "\|")
|
se ve como un carácter y no un símbolo especial es ponerlo entre[]
: es decir,split($0, a, "[|]")
# Me gusta más que '\ |', en algunos casos, especialmente como alguna variante de regexp ( perl vs grep vs .. otros?) puede tener "|" interpretado literalmente y "\ |" visto como separador de expresiones regulares, en lugar de lo contrario ... ymmvPara dividir una cadena en una matriz
awk
, utilizamos la funciónsplit()
:Si no se proporciona un separador, utiliza el
FS
, que por defecto es el espacio:Podemos dar un separador, por ejemplo
:
:Lo que es equivalente a configurarlo a través de
FS
:En gawk también puede proporcionar el separador como una expresión regular:
E incluso vea cuál era el delimitador en cada paso utilizando su cuarto parámetro:
Citemos la página de manual de GNU awk :
fuente
¡Por favor sé más específico! ¿Qué quieres decir con "no funciona"? Publique la salida exacta (o mensaje de error), su sistema operativo y la versión awk:
O, usando split:
Editar: en Solaris necesitará usar POSIX awk ( / usr / xpg4 / bin / awk ) para procesar 4000 campos correctamente.
fuente
for(i = 0
ofor(i = 1
?for (i = 1; i <= n; ++i)
...No me gusta la
echo "..." | awk ...
solución, ya que llama innecesariasfork
yexec
llamadas del sistema.Prefiero una solución de Dimitre con un pequeño giro
O una versión un poco más corta:
En este caso, se crea el registro de salida, que es una condición verdadera, por lo que se imprime.
En este caso específico el
stdin
redirección se puede ahorrar configurando unawk variable interna:solía ksh bastante tiempo, pero en intentoEsto podría ser manejado por la manipulación interna de la cadena. En el primer caso, la cadena original se divide por un terminador interno. En el segundo caso, se supone que la cadena siempre contiene pares de dígitos separados por un separador de un carácter.
El resultado en todos los casos es
fuente
bash
expresión ...En realidad,
awk
tiene una función llamada enlace 'Variable del separador de campo de entrada' . Así es como se usa. No es realmente una matriz, pero usa las variables internas $. Para dividir una cadena simple es más fácil.fuente
Deberia trabajar.
fuente
fuente
¿Broma? :)
Qué tal si
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Esta es mi salida:
así que supongo que está funcionando después de todo ...
fuente
Sé que esta es una pregunta vieja, pero pensé que tal vez alguien como mi truco. Especialmente porque esta solución no se limita a un número específico de elementos.
La salida será:
fuente