Linuxシェルwc -cカウント文字+1


17

コマンドwc -cを使用して文字数をカウントしましたが、例として間違った数、文字数、および1が表示されます。

echo "k" | wc -c 

それは私に2文字を与えます

なぜ1ではないのですか?


3
-cオプションは、バイト数ではなく文字数である
mcalex

1
-m、-charsは、同じ問題を使用した文字カウントを出力します
モハンマドカルミ

そうです、Unicodeは1文字あたり2バイトだと思っていましたが、UniのASCII文字はまだ1バイトであるようです。奇妙な。私はEOL考えている
mcalex

1
はい、私は、ファイル内の「K」と入力し、それが0好奇心を示すように、それは、私はそれを取り除い2つの文字を表示
ムハンマドKarmi

回答:


19

のヘルプメッセージをご覧くださいwc。この-cオプションは、文字数を出力します。このechoコマンドには、デフォルトで改行文字が含まれています。ときにwc改行を見て、それはあなたの結果では別の文字となり、追加の数としてカウントされます。これを回避するには、以下に示す代替手段のいずれかを使用します。-w単語の数を-lカウントし、行の数をカウントします。

echo "k" | wc -w 
echo "k" | wc -l

あなたは、パイプの出力可能wcには、awk改行文字を除いた文字の数を取得します:

wc <filename> | awk '{print $3-$1}'

wcオプションなしのデフォルト出力は、改行文字数($ 1からawk)、単語数、および文字数($ 3からawk)をこの順序で出力します。


わかりましたので、1つの単語と1つの行がありますが、OPは2つの文字/バイトがある理由を知りたいです
mcalex

単語でも行でもない文字の数をカウントしたい
モハンマドカルミ

5
ああ、という意味echo -n "k" | wc -cです。それは理にかなって
mcalex

文字をファイルに入れて、EOFがカウントされるようにしますか?または新しい行または何?、複数の文字をカウントしたいので
モハンマドカルミ

1
@ user1865719:printf多くのecho場合、一貫性が重要になる前に優先されます。具体的に尋ね、そうしない限り、それは改行を出力しませんprintf "k" | wc -m与え1印刷された文字の数、すなわち、。ファイルの最初の行の文字をカウントするには、たとえば$(($(head -1 file | wc -m)-1))$(())改行カウントを削除するためのシェル演算をラップして)またはawkとdoを使用しますawk 'NR==1{print length}' file
ダニエルアンダーソン

12

の場合echo "k"echoコマンドは印刷するように要求したものに改行文字を追加します( "k")。-nこれを無効にするオプションを使用できます。

echo -n k | wc -c
1

その目に見えないキャラクターを見るには、ストリームwhithをダンプするodhd

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl

6

これは、エコー(キャリッジリターンがある)を使用しているため、代わりにprintfを使用しているためです。

$ echo k | wc -c 2

$ printf k | wc -c 1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.