Мы хотим проверить, является ли это предложение повествовательным или время от времени сохранять его в 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
Чтобы разделить строки во входном файле на те, которые заканчиваются точкой, и те, которые не заканчиваются точкой, предполагая, что в каждой строке одно предложение, и сохранить их в двух разных выходных файлах, можно использовать grep
twice следующим образом:
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"