Eingabedatei ($1)

Eingabedatei ($1)

Wir möchten prüfen, ob dieser Satz deklarativ oder jetzt ist, und ihn dann in einer Datei speichern, declarative.txtdann den Rest der Sätze in others.txtdie Datei einfügen und anschließend die Anzahl der Zeilen declarative.txtam Ende der Datei angeben.

Ein Satz ist „deklarativ“, wenn er mit einem Punkt endet.

Eingabedatei ($1)

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

mein Code bisher

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

Antwort1

Um die Zeilen in der Eingabedatei in solche, die mit einem Punkt enden und solche, die das nicht tun, zu unterteilen (angenommen, es gibt einen einzelnen Satz pro Zeile), und sie in zwei verschiedenen Ausgabedateien zu speichern, können Sie „ greptwow“ wie folgt verwenden:

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

Es ist nicht notwendig, die Zeilen in einer Shell-Schleife zu durchlaufen (tatsächlichwird nicht empfohlen). Unix-Tools, die Textdateien verarbeiten, verfügen bereits über integrierte Schleifen, die dies tun. So grepwendet beispielsweise den regulären Ausdruck nacheinander auf jede Zeile der Eingabedaten an und gibt die übereinstimmenden aus.

Sie könnten auch damit auskommen, die Eingabedatei nur ein einziges Mal zu analysieren, beispielsweise mit awk:

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

Dies löst den Block aus, der die aktuelle Zeile in die Datei druckt declarative.txt, wenn die Zeile mit einem Punkt endet. Der andere Block wird für alle anderen Zeilen ausgelöst.

... oder mit sed:

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

Dies schreibt die aktuelle Zeile nach , declarative.txtwenn sie mit einem Punkt endet, und nach , others.txtwenn nicht. Der leere //Ausdruck bedeutet "den letzten regulären Ausdruck erneut verwenden", und der !bedeutet "Daswenn der Ausdruck nicht übereinstimmt".

Antwort2

Das istnichteine gültige Methode, Aussagesätze zu identifizieren. Zum einen beginnt keiner Ihrer Sätze mit einem Großbuchstaben und viele sind überhaupt keine Sätze. Wenn Sie jedoch nur die Zeilen Ihrer Eingabedatei in zwei Dateien aufteilen möchten, von denen eine die Zeilen enthält, die mit einem Punkt enden, und die andere den Rest, können Sie einfach Folgendes verwenden awk:

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

Wenn Sie dies wirklich als Shell-Skript tun müssen, können Sie einfach Folgendes verwenden:

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

Und wenn es eine Shell-Schleife sein muss (was keine gute Idee ist), du kannst tun:

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

Oder, wenn Sie Bash-spezifische Funktionen nicht verwenden können:

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

verwandte Informationen