Cómo dividir una cadena e imprimir todas las subcadenas usando cut

Tengo algunas cadenas separadas por comas y quiero dividirlas usando el comando de corte en bash:

This, is a, sample input.
This, is, another string, which could, appear, in my text, file.

También quiero imprimir todas las subcadenas en la salida. La salida deseada de la primera cadena es:

This
is a
sample input.

y esta es la salida deseada de la segunda cadena:

This
is
another string
which could
appear
in my text
file.

pero dado que la cantidad de comas (subcadenas) no está fijada en todas las cadenas, no sé cómo decirle al comando de corte que muestre todas las subcadenas. (por ejemplo, hay 2 comas en la primera cadena y 6 en la segunda). ¿Hay alguna forma de hacer esto en bash (con corte u otros comandos)?

Debo agregar que, aunque mis ejemplos en esta publicación están en inglés, mis cadenas reales están en idioma árabe. Me refiero al comando que quiero usar, tiene que poder trabajar con caracteres Unicode.

preguntado el 04 de julio de 12 a las 09:07

¿Bash es un requisito? El soporte Unicode en Python 3 podría facilitar el manejo del texto árabe. -

no, no es un requisito, pero es preferible. Dado que estoy escribiendo un script de bash para realizar otros procesos en esas cadenas, también prefiero dividirlos en bash. (Quiero decir que tengo algunos archivos, quiero leerlos, dividir sus líneas y hacer algunos otros procesos). Por cierto, si no hay otra herramienta útil para este propósito, tengo que dividir usando Perl... -

7 Respuestas

A mi modo de ver, el problema se puede abordar de dos maneras.

  1. lea las cadenas en fragmentos hasta que obtenga una coma. Utilizar read y matriz bash
  2. reemplazar comas (,) con nuevas líneas (\n). Usar tr.

IIRC, tr debe ser unicode seguro, mientras que sed depende de la implementación. No estoy 100% seguro de esto, tendré que buscarlo.


utilización de un matriz bash:

$ IFS=, read -ra arr <<< "μήλο, πορτοκάλι μπανάνα, αχλάδι"
$ printf "%s\n" "${arr[@]# }"
μήλο
πορτοκάλι μπανάνα
αχλάδι

usar tr

$ echo "μήλο, πορτοκάλι μπανάνα, αχλάδι" | tr ',' '\n'
μήλο
 πορτοκάλι μπανάνα
 αχλάδι

observe que esta sustitución dejará un espacio inicial, porque las palabras tienen un espacio después de la coma.

puede salirse con la suya reprocesando la salida para deshacerse de los espacios iniciales,
o preprocesando la cadena para suprimir los espacios después de las comas


Respondido 04 Jul 12, 10:07

Solo porque querías cortar:

line='This, is a, sample input.'
for i in $(seq 1 $(echo "$line," | tr -dc ',' | wc -c)); do
  echo $line | cut -d, -f$i; 
done

Respondido 04 Jul 12, 09:07

te pediría que usaras awk ¡¡para esto!!

$ echo "μήλο, πορτοκάλι, αχλάδι" | awk '{FS=", "}{for (i=1; i<=NF; i++) print $i}'

esto debería dar

μήλο
πορτοκάλι
αχλάδι

Respondido 04 Jul 12, 09:07

@c00kiemon5ter: ¡Intenté dar una nueva línea y esto no funciona! ¿¿Cómo haces eso?? Gracias por editar de todos modos!! :) - C0de_Hard

si coloca cuatro o más espacios antes de su línea, se formateará como código. para simplemente cambiar una línea, deje dos espacios al final de la línea anterior. Este es el marcado de rebajas. Busque más sobre esto en la web; está en todas partes en estos días. - c00kiemon5ter

Esto debería funcionar:

aa="This, is a, sample input."
bb="This, is, another string, which could, appear, in my text, file."

echo $aa|tr ',' '\n'

echo $bb|tr ',' '\n'

Saludos.

Respondido 13 Jul 15, 22:07

Puedes usar cortar y awk

Esta meditación de los ejemplo muestra cómo usarlos.

Respondido 04 Jul 12, 09:07

Puedes usar el comando tr

 IN="This, is a, sample input."

arr=$(echo $IN | tr "," "\n")

for x in $arr
do
    echo "$x"
done

Respondido 04 Jul 12, 09:07

O, si no está de acuerdo con los procesos secundarios, use Bash:

str='This, is a, sample input.'

IFS=','
set $str
# Remove leading spaces
while (( $# > 0 ))
do   
    echo "${1# }"    
    shift
done

EDITAR: y aquí hay una solución de Perl:

use warnings;
use strict;

my $str = 'This, is a, sample input.';
my @subs = split(', ',$str);

local $" = "\n";
print "@subs\n";

Respondido 04 Jul 12, 11:07

¿Es más fácil hacer esto en perl que en bash? ¿Cómo sería? - Juez

Un poco más fácil en Perl: depende de lo que necesite hacer con las subcadenas una vez que las tenga. - oscuro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.