входной файл ($1)

входной файл ($1)

Мы хотим проверить, является ли это предложение повествовательным или время от времени сохранять его в declarative.txtфайле, а затем поместить оставшиеся предложения в others.txtфайл и затем поместить количество строк declarative.txtв конце файла.

Предложение является «повествовательным», если оно заканчивается точкой.

входной файл ($1)

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

мой код софа

#!/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

решение1

Чтобы разделить строки во входном файле на те, которые заканчиваются точкой, и те, которые не заканчиваются точкой, предполагая, что в каждой строке одно предложение, и сохранить их в двух разных выходных файлах, можно использовать greptwice следующим образом:

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

Нет необходимости перебирать строки в цикле оболочки (на самом деле, этообескуражен). Инструменты Unix, обрабатывающие текстовые файлы, имеют встроенные циклы, которые уже это делают, так grep, например, будет применять регулярное выражение к каждой строке входных данных по очереди и выводить те, которые соответствуют.

Вы также можете обойтись анализом входного файла только один раз, например awk:

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

Это запускает блок, который печатает текущую строку в файл, declarative.txtесли строка заканчивается точкой. Другой блок будет запущен для всех остальных строк.

... или с sed:

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

Это записывает текущую строку в , declarative.txtесли она заканчивается точкой, и в , others.txtесли нет. Пустое //выражение означает «повторно использовать последнее регулярное выражение», а !означает «сделатьэтотесли выражение не совпало».

решение2

Этонетдопустимый способ определения повествовательных предложений. Во-первых, ни одно из ваших предложений не начинается с заглавной буквы, а многие вообще не являются предложениями. Но если вы просто хотите разделить строки вашего входного файла на два файла, один из которых будет содержать строки, заканчивающиеся точкой, а другой — все остальное, вы можете просто использовать awk:

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

Если вам действительно нужно сделать это как скрипт оболочки, вы можете просто использовать:

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

И если это должен быть цикл оболочки (что не очень хорошая идея), ты можешь сделать:

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

Или, если вы не можете использовать специфичные для bash функции:

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

Связанный контент