有没有办法获得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
答案 0 :(得分:82)
最简单的回答:
wc < filename
答案 1 :(得分:75)
只需:
wc -l < file_name
将完成这项工作。但是这个输出包括前缀空格,wc
右对齐数字。
答案 2 :(得分:55)
wc $file | awk {'print "$4" "$2" "$1"'}
根据您的布局进行调整。
使用正逻辑(“是文件”)而不是负面(“不是目录”)也更好
[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
答案 3 :(得分:49)
您可以使用cut
命令获取wc
输出的第一个单词(行或单词计数):
lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
答案 4 :(得分:32)
有时wc在不同平台上以不同格式输出。例如:
在OS X中:
$ echo aa | wc -l
1
在Centos中:
$ echo aa | wc -l
1
因此仅使用剪切可能无法检索该数字。而是尝试删除空格字符:
$ echo aa | wc -l | tr -d ' '
答案 5 :(得分:19)
不对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}'
答案 6 :(得分:10)
如果您将文件名重定向到wc
,则会在输出时省略文件名。
击:
read lines words characters <<< $(wc < filename)
或
read lines words characters <<EOF
$(wc < filename)
EOF
不要使用for
迭代ls
的输出,而是执行此操作:
for f in *
如果文件名包含空格,将起作用。
如果你不能使用globbing,你应该管道进入while read
循环:
find ... | while read -r f
或使用流程替换
while read -r f
do
something
done < <(find ...)
答案 7 :(得分:2)
如果文件很小,你可以负担两次调用wc
,并使用类似下面的内容,这样可以避免进入额外的过程:
lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))
$((...))
是bash的Arithmetic Expansion。在这种情况下,它会从wc
的输出中删除任何空格。
如果您需要 或 wordcount,此解决方案更有意义。
答案 8 :(得分:2)
sed
怎么样?
wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
答案 9 :(得分:1)
尝试使用此数字结果:
nlines = $(wc -l&lt; $ myfile)
答案 10 :(得分:0)
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d' ' -f1)
答案 11 :(得分:0)
试试这个:
wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE " words: " WC }'
它创建一个行数和字数(LINE和WC),并使用从wc中提取的值增加它们(第一列的值为$ 1,第二列为$ 2),最后打印结果。
答案 12 :(得分:0)
“基本上我想在文件名之后将行号和字数写入屏幕。”
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
输出: myfile.txt文件 线:10 字数:20 字节:120
答案 13 :(得分:0)
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"
答案 14 :(得分:0)
类似的事情可能会有所帮助:
#!/bin/bash
printf '%-10s %-10s %-10s\n' 'File' 'Lines' 'Words'
for fname in file_name_pattern*; {
[[ -d $fname ]] && continue
lines=0
words=()
while read -r line; do
((lines++))
words+=($line)
done < "$fname"
printf '%-10s %-10s %-10s\n' "$fname" "$lines" "${#words[@]}"
}
答案 15 :(得分:0)
要(1)运行一次wc
,并且(2)不分配任何多余的变量,请使用
read lines words <<< $(wc < $f | awk '{ print $1, $2 }')
完整代码:
for f in *
do
if [ ! -d $f ]
then
read lines words <<< $(wc < $f | awk '{ print $1, $2 }')
echo "$f $lines $words"
fi
done
示例输出:
$ find . -maxdepth 1 -type f -exec wc {} \; # without formatting
1 2 27 ./CNAME
21 169 1065 ./LICENSE
33 130 961 ./README.md
86 215 2997 ./404.html
71 168 2579 ./index.html
21 21 478 ./sitemap.xml
$ # the above code
404.html 86 215
CNAME 1 2
index.html 71 168
LICENSE 21 169
README.md 33 130
sitemap.xml 21 21
答案 16 :(得分:0)
已回答问题中提出的解决方案不适用于达尔文内核。
请考虑以下适用于所有 UNIX 系统的解决方案:
wc -l < file.txt | xargs
wc -m < file.txt | xargs
wc -c < file.txt | xargs
wc -w < file.txt | xargs
答案 17 :(得分:-1)
您必须对wc
使用输入重定向:
number_of_lines=$(wc -l <myfile.txt)
分别根据您的情况
echo "$f $(wc -l <"$f") $(wc -w <"$f")"
答案 18 :(得分:-2)
另一种方式,类似于@BananaNeil发布的内容:
$ cat myfile.txt | wc -l