Wir möchten prüfen, ob dieser Satz deklarativ oder jetzt ist, und ihn dann in einer Datei speichern, declarative.txt
dann den Rest der Sätze in others.txt
die Datei einfügen und anschließend die Anzahl der Zeilen declarative.txt
am 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 „ grep
twow“ 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 grep
wendet 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.txt
wenn sie mit einem Punkt endet, und nach , others.txt
wenn 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"