入力ファイル ($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

入力ファイル内の行をドットで終わる行とそうでない行に分割し、行ごとに 1 つの文があると仮定して、それらを 2 つの異なる出力ファイルに保存するには、grep次のように を 2 回使用します。

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

シェルループ内の行をループする必要はありません(実際、推奨されない)。テキスト ファイルを処理する Unix ツールには、既にこれを行うループが組み込まれているため、grepたとえば、は、入力データの各行に正規表現を順番に適用し、一致するものを出力します。

次のように入力ファイルを 1 回だけ解析するだけでもかまいません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

これはない宣言文を識別する有効な方法です。まず、あなたの文はどれも大文字で始まっていませんし、多くは文でさえありません。しかし、入力ファイルの行を 2 つのファイルに分割し、1 つのファイルに終止符で終わる行を、もう 1 つのファイルに残りの行を格納したい場合は、次のようにします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"

関連情報