bashでwcから整数のみを取得


115

wcがbashで返す整数を取得する方法はありますか?

基本的には、ファイル名の後に行番号とワードカウントを画面に書き込みます。

output: filename linecount wordcount ここに私がこれまでに持っているものがあります:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

回答:


57

cutコマンドを使用して、wc出力の最初の単語(行数または単語数)のみを取得できます。

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
同じファイルに対してwcを2回実行するのは非効率的です。
ガウィ

3
確かに、それがジェームズ・ブロードヘッドの答えの方がはるかに良いと思う理由です。フィールド間のスペースの数が異なるため、のcut完全な出力を処理することができませんでしたwc $f
カサブランカ

1
@casablanca 'tr -s'を使用してスペースの数を絞ることができます。以下の私の回答に、この質問に対するよりポータブルなソリューションをリストしました。
ルーブル

この回答では変数に割り当てているため、
次のコマンドで

88

これまでで最も簡単な答え:

wc < filename 

5
ただし、目的の出力は生成されません。
Dave Newton

確かにそうです、とにかく適切なパラメータを渡すだけです。たとえば、を実行wc -c < file nameすると、整数のバイト数だけが提供されます。
BananaNeil 2012年

13
私のポイントは、もしあなたが(1.5歳)の質問に答えるなら、すべての情報を答えに入れるかもしれない、それだけです:)
Dave Newton

おっと、ちょうど再読み込み質問.. #fail、私が取得する方法を研究していただけの整数を、と私は良い答えを発見したときに、答えの1からの情報を使用して、それについて投稿することを決めました。申し訳ありません...
BananaNeil

3
あなたはグーグルに答えました、それが重要です。:-)
Ciro Santilli郝海东冠状病六四事件法轮功

82

ただ:

wc -l < file_name

仕事をします。ただし、この出力にはプレフィックス付きの空白が含まれています。wc、数値を右揃えするため、ています。


3
空白なしでちょうど行数を取得するには、次のwc -l < foo.txt | xargsREF - stackoverflow.com/a/12973694/149428
テイラーEdmiston

1
したがって、コマンドが先頭のスペースを含む回答を生成する一方で、質問者が変数に割り当てていたため、先頭のスペースが自動的に削除されました(少なくとも、これは古いOSX bashでの私の経験でした)。つまり、lines=`wc -l < $f`値に先行スペースがない変数「行」が生成されます。
サイコリンズ

findでパイプを使用している場合はどうなりますか?エラー find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lが表示されます。問題なく動作しますが、すべてのファイルが印刷されます。使用するfind . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <とエラーが発生します。parse error near '\n'
NunoGonçalves19年

55
wc $file | awk {'print "$4" "$2" "$1"'}

必要に応じてレイアウトを調整します。

また、否定(「ディレクトリではない」)よりも肯定的なロジック(「ファイルである」)を使用する方が良いです。

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
Cmder(bash 4.4.12)の私のWindowsでは、これは機能しwc $file | awk '{print $4" "$2" "$1}'ます{}
Grzegorz Gierlik 2017

36

時々、異なるプラットフォームでは異なるフォーマットでwcが出力されます。例えば:

OS Xの場合:

$ echo aa | wc -l

         1

Centosの場合:

$ echo aa | wc -l

1

したがって、カットのみを使用すると、番号を取得できない場合があります。代わりに、スペース文字を削除するためにtrを試してください:

$ echo aa | wc -l | tr -d ' '

23

承認済み/人気のある回答はOSX では機能しませ

以下のいずれも、bsdとlinuxで移植可能でなければなりません。

wc -l < "$f" | tr -d ' '

または

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

または

wc -l "$f" | awk '{print $1}'

11

ファイル名をwcそれにリダイレクトすると、出力時にファイル名が省略されます。

バッシュ:

read lines words characters <<< $(wc < filename)

または

read lines words characters <<EOF
$(wc < filename)
EOF

を使用forしての出力を反復処理する代わりにls、次のようにします。

for f in *

スペースを含むファイル名がある場合に機能します。

グロビングを使用できない場合は、while readループにパイプする必要があります。

find ... | while read -r f

またはプロセス置換を使用

while read -r f
do
    something
done < <(find ...)

とにかくあなたに賛成しましたが、ファイル名をリダイレクトする必要はありません。追加フィールドとしてキャプチャするだけです。read lines words characters filename <<< $(wc "$f")ああ、*を使用してスペースを強化する場合は、varを使用するときにも二重引用符で囲む必要があります。
Bruno Bronosky 2013年

追加の変数を使用することは確かにそれを行う別の方法ですが、変数を使用しない場合(おそらく、変数にファイル名が既にある場合- $fこの場合)、それは不要です。また、OP は整数だけを取得する方法を求めました。変数を引用することは正しいですが、変数の使用法は示していないので、その点については触れませんでした。for f in *フォームは、ほとんど常にの出力を使用しての代わりに使用する必要がありls、あなたが知っているように、。
追って通知があるまで一時停止。

私はそのls点に完全に同意します。それはあなたに賞を与えるでしょう。partmaps.org/era/unix/award.html#ls
Bruno Bronosky 2013年

:ファイル名をしたくない場合は、これを行うことができread lines words characters _ <<< $(wc "$f")

@EvanTeitelman:あなたの上のコメントのいくつかで議論したように。$_は別の変数です。
追って通知があるまで一時停止。

3

ファイルが小さい場合は、wc2回呼び出す余裕があり、次のようなものを使用できます。これにより、余分なプロセスへのパイプを回避できます。

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

これ$((...))は、bash の算術展開です。それはの出力から空白を削除しますwcこの場合。

このソリューションは、行数または単語数のいずれかが必要な場合により意味があります


2

どうsedですか?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

数値の結果については、これを試してください:
nlines = $(wc -l <​​$ myfile)


0

これを試して:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

行数と単語数(LINEとWC)を作成し、wcから抽出した値(最初の列の値に$ 1を使用し、2番目の列に$ 2を使用)で増やし、最後に結果を出力します。


0

「基本的には、ファイル名の後に行番号とワード数を画面に書き込みたい」

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

出力:myfile.txt行:10ワード:20バイト:120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

perlとにかくあなたが使っているなら、Perlでも単語数を数えるかもしれません。より経済的なアプローチは、パイプtr -d '[:space:]'
ライン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.