この文が宣言文であるかどうかを確認し、それをファイルに保存して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"