arquivo de entrada ($1)

arquivo de entrada ($1)

Queremos verificar se esta frase é declarativa ou de vez em quando armazená-la em declarative.txtum arquivo, depois colocar o restante das frases em others.txtum arquivo e depois colocar o número de linhas de declarative.txtno final do arquivo.

Uma frase é "declarativa" se terminar com ponto final.

arquivo de entrada ($1)

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

meu código agora

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

Responder1

Para dividir as linhas no arquivo de entrada entre aquelas que terminam com ponto e aquelas que não terminam, assumindo que haja uma única frase por linha, e salvá-las em dois arquivos de saída diferentes, você pode usar grepduas vezes assim:

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

Não há necessidade de percorrer as linhas em um shell loop (na verdade,está desanimado). As ferramentas Unix que lidam com arquivos de texto já possuem loops integrados que já fazem isso, então grep, por exemplo, aplicarão a expressão regular a cada linha de dados de entrada por vez e produzirão aquelas que corresponderem.

Você também pode analisar o arquivo de entrada apenas uma única vez, por exemplo awk:

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

Isso aciona o bloco que imprime a linha atual no arquivo declarative.txtse a linha terminar com um ponto. O outro bloco será acionado para todas as outras linhas.

... ou com sed:

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

Isso grava a linha atual declarative.txtse terminar com um ponto e others.txtse não terminar. A expressão vazia //significa "reutilizar a última expressão regular", e os !meios "fazeressese a expressão não corresponder".

Responder2

Isso énãouma forma válida de identificar sentenças declarativas. Por um lado, nenhum dos seus começa com letra maiúscula e muitos nem sequer são frases. Mas se você quiser apenas separar as linhas do seu arquivo de entrada em dois arquivos, um contendo as linhas que terminam com um ponto final e o outro contendo o resto, você pode simplesmente usar awk:

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

Se você realmente precisa fazer isso como um script de shell, você pode simplesmente usar:

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

E se for um shell loop (o que não é uma boa ideia), você pode fazer:

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

Ou, se você não puder usar recursos específicos do bash:

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

informação relacionada