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
cut
コマンドを使用して、wc
の出力の最初のワード(行またはワード数)を取得できます。
lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
これまでで最も簡単な答え:
wc < filename
ただ:
wc -l < file_name
仕事をします。ただし、この出力には、wc
が数値を右揃えするため、接頭辞付きの空白が含まれます。
wc $file | awk {'print "$4" "$2" "$1"'}
必要に応じてレイアウトを調整します。
ネガティブ(「ディレクトリではない」)よりもポジティブロジック(「is a file」)を使用する方が良い
[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
時々、wcは異なるプラットフォームで異なる形式で出力します。例えば:
OS Xの場合:
$ echo aa | wc -l
1
In Centos:
$ echo aa | wc -l
1
したがって、カットのみを使用すると、番号が取得されない場合があります。代わりに、trを試してスペース文字を削除します。
$ echo aa | wc -l | tr -d ' '
受け入れられた/人気のある回答はnot OSXで動作します。
次のいずれかは、bsdおよびlinuxで移植可能です。
wc -l < "$f" | tr -d ' '
OR
wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2
OR
wc -l "$f" | awk '{print $1}'
ファイル名を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 ...)
ファイルが小さい場合は、wc
を2回呼び出す余裕があり、次のようなものを使用できます。これにより、余分なプロセスへのパイプが回避されます。
_lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))
_
$((...))
は、bashの 算術展開 です。この場合、wc
の出力から空白を削除します。
either the linecount or wordcountが必要な場合、このソリューションはより意味があります。
sed
はどうですか?
wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
数値結果のためにこれを試してください:
nlines = $(wc -l <$ myfile)
files=`ls`
echo "$files" | wc -l | Perl -pe "s#^\s+##"
「基本的に、ファイル名の後に画面に行番号とワード数を書きたい」
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
出力:myfile.txt行:10ワード:20バイト:120
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d' ' -f1)
これを試して:
wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE " words: " WC }'
行カウントとワードカウント(LINEおよびWC)を作成し、wcから抽出した値でそれらを増やし(最初の列の値に$ 1、2番目の列に$ 2を使用)、最終的に結果を出力します。