Ответ 1
Вы можете использовать команду cut
, чтобы получить только первое слово вывода wc
(которое является строкой или числом слов)
lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
Есть ли способ получить целое число, возвращаемое 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 $file | awk {'print "$4" "$2" "$1"'}
Отрегулируйте по мере необходимости ваш макет.
Также полезно использовать положительную логику ( "файл" ) по отрицательной ( "не каталог" )
[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
Просто:
wc -l < file_name
выполнит задание
Иногда wc выдает в разных форматах на разных платформах. Например:
В OS X:
$ echo aa | wc -l
1
В Centos:
$ echo aa | wc -l
1
Таким образом, использование только разреза может не получить номер. Вместо этого попробуйте tr для удаления пробелов:
$ echo aa | wc -l | tr -d ' '
Если вы перенаправляете имя файла в wc
, он пропускает имя файла на выходе.
Bash:
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 ...)
Принятые/популярные ответы выполняют не работу с OSX.
Любое из следующего должно быть переносимым на bsd и linux.
wc -l < $f | tr -d ' '
ИЛИ
wc -l $f | tr -s ' ' | cut -d ' ' -f 2
ИЛИ
wc -l $f | awk '{print $1}'
Если файл мал, вы можете позволить себе вызывать wc
дважды, и использовать что-то вроде следующего, что позволяет избежать пересылки в дополнительный процесс:
lines=$((`wc -l $f`))
words=$((`wc -w $f`))
$((...))
- Арифметическое расширение bash. В этом случае он удаляет любые пробелы с вывода wc
.
Это решение имеет смысл, если вам нужно или linecount или wordcount.
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d' ' -f1)
Как насчет 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+##"
Попробуйте следующее:
wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE " words: " WC }'
Он создает счетчик строк и количество слов (LINE и WC) и увеличивает их со значениями, извлеченными из wc (используя $1 для первого значения столбца и $2 для второго) и, наконец, печатает результаты.
Другой способ, похожий на то, что отправил @BananaNeil:
$ cat myfile.txt | wc -l
"В принципе, я хочу написать номера строк и количество слов на экране после имени файла".
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
Выходы: myfile.txt линий: 10 слов: 20 байтов: 120