从bash中获取wc中的整数

时间:2010-09-19 18:33:47

标签: bash wc

有没有办法获得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

19 个答案:

答案 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 系统的解决方案:

  1. 准确打印文件的行数:
wc -l < file.txt | xargs
  1. 准确打印文件的字符数:
wc -m < file.txt | xargs
  1. 准确打印文件的字节数:
wc -c < file.txt | xargs
  1. 准确打印文件的字数:
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