archivo de entrada ($1)

archivo de entrada ($1)

Queremos verificar si esta oración es declarativa o, de vez en cuando, almacenarla en declarative.txtun archivo, luego colocar el resto de las oraciones en others.txtel archivo y luego colocar el número de líneas declarative.txtal final del archivo.

Una oración es "declarativa" si termina con un punto.

archivo de entrada ($1)

this life is good.
neverthe less.
suppppppppppppppppperb.
the best coders.
everything is good?
are you okay dude?
ma man !!

mi código hasta ahora

#!/bin/sh
while read row
do
x=$row | grep "\.$"
y=$row | grep -v "\.$"
echo $x >> declarative.txt
echo $y >> others .txt
done < $1
cnt=`wc -l declarative.txt`
echo $cnt >> declarative.txt

Respuesta1

Para dividir las líneas en el archivo de entrada en las que terminan con un punto y las que no, asumiendo que hay una sola oración por línea, y guardarlas en dos archivos de salida diferentes, puedes usar grepdos veces así:

grep    '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt

No es necesario recorrer las líneas en un bucle de shell (de hecho,esta desanimado). Las herramientas de Unix que manejan archivos de texto tienen bucles incorporados que ya hacen esto, por lo que grep, por ejemplo, aplicará la expresión regular a cada línea de datos de entrada por turno y generará las que coincidan.

También puede salirse con la suya analizando el archivo de entrada solo una vez, por ejemplo awk:

awk '/\.$/ { print >"declarative.txt"; next }
           { print >"others.txt" }' "$1"

Esto activa el bloque que imprime la línea actual en el archivo declarative.txtsi la línea termina con un punto. El otro bloque se activará para todas las demás líneas.

... o con sed:

sed -n -e '/\.$/w declarative.txt' \
       -e '//!w others.txt' "$1"

Esto escribe la línea actual declarative.txtsi termina con un punto y others.txtsi no lo hace. La expresión vacía //significa "reutilizar la última expresión regular" y !significa "hacerestesi la expresión no coincide".

Respuesta2

Esto esnouna forma válida de identificar oraciones declarativas. Por un lado, ninguno de los suyos comienza con mayúscula y muchos ni siquiera son oraciones. Pero si solo desea separar las líneas de su archivo de entrada en dos archivos, uno que contenga las líneas que terminan con un punto y el otro que contenga el resto, puede usar awk:

awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' file

Si realmente necesitas hacer esto como un script de shell, simplemente puedes usar:

#!/bin/sh
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' "$1"

Y si debe ser un bucle de shell (lo cual no es una buena idea), tu puedes hacer:

#!/bin/bash
while IFS= read -r line; do 
    [[ $line =~ \.$ ]] && 
        echo "$line" >> fullStop || 
        echo "$line" >> others
    done < "$1"

O, si no puedes usar funciones específicas de bash:

#!/bin/sh
while IFS= read -r line; do 
    printf '%s\n' "$line" | grep -q '\.$' && 
    echo "$line" >> fullStop || 
    echo "$line" >> others
done < "$1"

información relacionada