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

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

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

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

入力ファイルを一度だけ解析することもできます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そうでなければ書かれます。空//の式は「最後の正規表現の再利用」を意味し、空の式!は「実行」を意味します。これ表現が一致しない場合。

おすすめ記事