私はbashに最初に触れ、ファイル内の文字数を数えようとしています。私は次の関数を書いた。
function chars(){
m=$(cat $1)
m=${#m}
echo $m
}
echo $(chars $2)
ファイルから呼び出された結果は524、wc -c
同じファイルから呼び出された結果は525です。違いの原因は何ですか?どうすれば同じ結果が得られますか? (追加の質問で、関数の最初の2行を1つにまとめることができますか?)
答え1
wc -c
バイト数を返します。
wc -m
文字数を返します。
あなたの関数は文字数を数えるので、あなたの関数の出力番号はの出力とwc -m
一致する必要があると思います。
答え2
wc
次のコマンドを試すことができます。
echo -n file | wc -m
この方法で追加された追加の改行文字は計算されませんwc
。通常、ファイルの末尾には改行文字(エディタが追加)がありますwc
。したがって、その文字も計算するにはソリューションを変更する必要があります。それ以外の場合、関数は正しく機能します。
答え3
ファイルを見ないと正確に理由を言うのは難しいですが、Bashでこのように計算するときに発生する問題を示す小さなサンプルファイルは次のとおりです。
はい
$ cat afile
blah
blah
<EOF>
実際には<EOF>
ファイルには存在せず、ファイルの末尾に2つの空行があることだけが表示されます。したがって、ファイルを手動で計算すると、その中に12文字があります。 8 + 4(改行文字)だとしましょう。
このファイルの数を数えるには、一般的な方法を使用してください。
$ wc -m afile
12 afile
バイト数:
$ wc -c afile
12 afile
あなたの方法を使用してください:
$ m=$(< afile)
$ echo ${#m}
9
この計算方法が期待どおりに機能しないようです。\n
他の文字を含まない行に現れる行末文字()は計算できません。
あなたの問題
524対525の質問に対するあなたの説明によると、サンプルファイルに空白行があるようです。
wc
私のソリューションを適用する代わりに、このアプリケーションでそれを使用します。これらのツールは理由があるため存在します。ホイールを再発明しないでください。 Unixはあなたの車のための素晴らしい雑誌を作りました。