Tengo el siguiente código que divide la línea cada 10 palabras.

    #!/bin/bash

while read line
do
counter=1;
    for word in $line
    do
        echo -n $word" ";
    if (($counter % 10 == 0))
      then
        echo "";
    fi
    let counter=counter+1;
    done
done < input.txt

El problema es que el punto de división es la décima palabra. En cambio, quiero que el punto de división sea el primer carácter de coma (solo para oraciones con más de 10 palabras).

Ejemplo:

Línea1: frase de una línea de prueba, que quiero dividir, y no sé cómo.

Para

Línea1: frase de una línea de prueba, línea2: que quiero dividir, y no sé cómo.

Si no se encuentra ningún carácter de coma, simplemente devuelva la línea.

¡Gracias!

Editar: funcionará una solución Python o Bash.

1
HenryM 4 oct. 2019 a las 19:51

4 respuestas

La mejor respuesta

Un mejor enfoque es utilizar awk y probar 15 o más palabras y, de ser así, simplemente sustituir ",\n" por ", ", p. Ej.

awk 'NF >= 15 {sub (", ", ",\n")}1' file

Ejemplo de uso / salida

Con su entrada en file, tendría:

$ awk 'NF >= 15 {sub (", ", ",\n")}1' file
phrase from a test line,
which I want to split, and I don't know how.

(si tiene una gran cantidad de líneas, awk será un orden de magnitud más rápido que un bucle de shell)

2
David C. Rankin 4 oct. 2019 a las 17:51

No estoy seguro si desea dividir entre 10 palabras o 15 palabras.

Simplemente reemplace 10 con 15 en caso de que esté tratando con 15 palabras.

awk -v OFS=, 'NF > 10{ sub(/, */, ",\n", $0); print }' input.txt

O más claramente:

#! /bin/bash

awk -v OFS=, 'NF > 10{

    # enter this block iff words > 10

    # replace first occurence of , and additional space,
    # if any, with newline
    sub(/, */, ",\n", $0)
    print

}' input.txt
2
Mihir 4 oct. 2019 a las 17:51

Esta es una versión simple de la pregunta for loop in bash simplemente imprime n veces el comando en lugar de reiterar

La versión simple se puede manejar con

# For each line with 10 words append a newline after the first comma
sed -r '/((\w)+ ){10}/s/,/,\n/' input.txt
0
Walter A 4 oct. 2019 a las 22:28

Aquí hay una solución simple que verifica el número de palabras en una cadena. si el número de palabras en una cadena es más de 10, se dividirá:

output = []
s = 'phrase from a test line, which I want to split, and I dont know how'
while len (s.split()) > 10:
    first_sent,s = s.split(',',1)
    output.append(first_sent)
output.append(s)
0
Prish 4 oct. 2019 a las 17:39
58240415