状況は次のとおりです。一連の文字を含む.txtファイルがあり、すべてbijの改行で区切られています。以下はファイルの小さなセクションです。
lrtjxz
lrtjhs
lrtsxv
lrtvsw
lrtywj
lrtyws
lrxwwv
lrvhsx
lryjts
lrytwv
lrzvwj
lzwscr
lzjrww
lzjroj
lzjrvs
lzjrhs
lzojvs
行の1つがアルファベット順になった回数を数えるスクリプトを作成しました。しかし、何らかの理由でエコーはゼロではありません。
スクリプト:
cat file.txt | while read line
do
alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
then
count=$((count + 1))
fi
done
echo "$newCount"
私が間違っていることを知っている人はいますか?
答え1
実際には2つの異なる問題があり、どちらもエコー結果が発生しない可能性があります。
詳細は次のとおりです。
悪い比較
あなたは次のように書きました:
alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
grep -o
各一致を別々の行に入れます。.
単一文字の一致- 元の行に水平文字があります。
- しかし、
grep -o
文字を「垂直に」配置すると - したがって、オリジナルは
$line
grep以降の行と決して同じではありません。
たとえば、コマンドプロンプトで次のことをテストできます。
$ line="abc"
$line
それでは、元のテキストに含まれているものを見てください。
$ echo "$line"
abc
次に、変更する方法を見てくださいgrep -o
。これは基本的に$alphabeticSorted
$echo "$line" | grep -o .
a
b
c
だからあなたがこのように書いたことを覚えておいてください。
if [ "$line" == "$alphabeticSorted" ]
Bashが実際にテストするものは次のとおりです。
abc
同じ
a
b
c
ご覧のとおり、これは同じではありませんので、オリジナルが完全にアルファベット順であっても、あなたのif
声明は決して正確ではありません。$line
水平方向または垂直方向に同じ方向に設定することをお勧めします。 Bashでテストできるように水平にしましょう
$ line2=$( echo $line | grep -o . | sort | tr -d '\n'
$ echo $line2
abc
- コマンドを追加し
tr
、-d
何かを削除し、新しい行を追加します。\n
- したがって、
$line2
次のように「水平」です。$line1
したがって、元のコードで修正すると
alphabeticSorted=$(echo $line | grep -o . | sort | tr -d '\n')
if [ "$line" == "$alphabeticSorted" ]
今これはより合理的な比較になります。
無効な変数
ただし、この問題を解決しても、公開したスクリプトには2番目の問題があります。つまり、コード本文に次のような内容があるということです。
count=$((count + 1))
$count
しかし、あなたはそれについて全く言及せず、次のように書いたと言いました。
echo "$newCount"
もちろん、定義がないので、$newCount
これを呼び出すと価値もなく、何もないので何も得られません。おそらくあなたが望むものは次のとおりです。
echo "$count"
したがって、これら2つのバグが修正されたので、提供されたコードでわかる限り、これはうまくいきます。