string - separadores - awk unix
¿Cómo dividir una cadena delimitada en una matriz en awk? (7)
¡Por favor sé más específico! ¿A qué te refieres con "no funciona"? Publique la salida exacta (o mensaje de error), su sistema operativo y la versión awk:
% awk -F/| ''{
for (i = 0; ++i <= NF;)
print i, $i
}'' <<<''12|23|11''
1 12
2 23
3 11
O, usando split:
% awk ''{
n = split($0, t, "|")
for (i = 0; ++i <= n;)
print i, t[i]
}'' <<<''12|23|11''
1 12
2 23
3 11
Editar: en Solaris , necesitará utilizar POSIX awk ( / usr / xpg4 / bin / awk ) para procesar 4000 campos correctamente.
Cómo dividir la cadena cuando contiene símbolos de tubería |
en eso. Quiero dividirlos para que estén en conjunto.
Lo intenté
echo "12:23:11" | awk ''{split($0,a,":"); print a[3] a[2] a[1]}''
Lo cual funciona bien. Si mi cadena es como "12|23|11"
, ¿cómo los divido en una matriz?
¿Broma? :)
¿Qué tal echo "12|23|11" | awk ''{split($0,a,"|"); print a[3] a[2] a[1]}''
echo "12|23|11" | awk ''{split($0,a,"|"); print a[3] a[2] a[1]}''
Este es mi resultado:
p2> echo "12|23|11" | awk ''{split($0,a,"|"); print a[3] a[2] a[1]}''
112312
así que supongo que está funcionando después de todo ..
Has probado:
echo "12|23|11" | awk ''{split($0,a,"|"); print a[3],a[2],a[1]}''
No me gusta el echo "..." | awk ...
echo "..." | awk ...
solución ya que llama fork
innecesario y llamadas al sistema exec
.
Prefiero una solución de Dimitre con un pequeño giro
awk -F/| ''{print $3 $2 $1}'' <<<''12|23|11''
O una versión más corta:
awk -F/| ''$0=$3 $2 $1'' <<<''12|23|11''
En este caso, el registro de salida se arma, que es una condición verdadera, por lo que se imprime.
En este caso específico, la redirección stdin
se puede ahorrar con la configuración de una variable interna awk :
awk -v T=''12|23|11'' ''BEGIN{split(T,a,"|");print a[3] a[2] a[1]}''
ksh bastante tiempo, pero en bash esto podría manejarse mediante manipulación interna de cadenas. En el primer caso, la secuencia 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.
T=''12|23|11'';echo -n ${T##*|};T=${T%|*};echo ${T#*|}${T%|*}
T=''12|23|11'';echo ${T:6}${T:3:2}${T:0:2}
El resultado en todos los casos es
112312
Para dividir una cadena en una matriz en awk
usamos la función split()
:
awk ''{split($0, a, ":")}''
# ^^ ^ ^^^
# | | |
# string | delimiter
# |
# array to store the pieces
Si no se proporciona ningún separador, usa el FS
, que por defecto es el espacio:
$ awk ''{split($0, a); print a[2]}'' <<< "a:b c:d e"
c:d
Podemos dar un separador, por ejemplo:
$ awk ''{split($0, a, ":"); print a[2]}'' <<< "a:b c:d e"
b c
Lo cual es equivalente a establecerlo a través del FS
:
$ awk -F: ''{split($0, a); print a[1]}'' <<< "a:b c:d e"
b c
En gawk también puede proporcionar el separador como una expresión regular:
$ awk ''{split($0, a, ":*"); print a[2]}'' <<< "a:::b c::d e" #note multiple :
b c
E incluso ver qué era el delimitador en cada paso usando su cuarto parámetro:
$ awk ''{split($0, a, ":*", sep); print a[2]; print sep[1]}'' <<< "a:::b c::d e"
b c
:::
Vamos a citar la página man:
split (cadena, matriz [, fieldsep [, seps]])
Divida el hilo en piezas separadas por el campo y almacene las piezas en el conjunto y las cadenas separadoras en el conjunto seps. La primera pieza se almacena en la matriz split() , la segunda pieza en la matriz [2], y así sucesivamente. El valor de cadena del tercer argumento, fieldsep, es una expresión regular que describe dónde dividir la cadena (de la misma manera que FS puede ser una expresión regular que describe dónde dividir los registros de entrada). Si se omite fieldsep, se usa el valor de FS. split () devuelve la cantidad de elementos creados. seps es una extensión de gawk, con seps [i] siendo la cadena de separación entre la matriz [i] y la matriz [i + 1]. Si fieldsep es un espacio único, cualquier espacio en blanco inicial entra en seps [0] y cualquier espacio en blanco posterior entra en seps [n], donde n es el valor de retorno de split () (es decir, el número de elementos en el conjunto).
echo "12|23|11" | awk ''{split($0,a,"|"); print a[3] a[2] a[1]}''
echo "12|23|11" | awk ''{split($0,a,"|"); print a[3] a[2] a[1]}''
Deberia trabajar.