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
そうでなければ書かれます。空//
の式は「最後の正規表現の再利用」を意味し、空の式!
は「実行」を意味します。これ表現が一致しない場合。
答え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"