Результаты WC в качестве переменных - PullRequest
25 голосов
/ 19 августа 2011

Я хотел бы использовать строки из 'wc' в качестве переменных.Например:

echo 'foo bar' > file.txt
echo 'blah blah blah' >> file.txt
wc file.txt

2  5 23 file.txt

Мне бы хотелось, чтобы что-то вроде $lines, $words и $characters было связано со значениями 2, 5 и 23.Как я могу сделать это в Bash?

Ответы [ 7 ]

37 голосов
/ 19 августа 2011

В чистом виде: (без awk)

a=($(wc file.txt))
lines=${a[0]}
words=${a[1]}
chars=${a[2]}

Это работает с использованием массивов bash. a=(1 2 3) создает массив с элементами 1, 2 и 3. Затем мы можем получить доступ к отдельным элементам с синтаксисом ${a[indice]}.

Альтернатива: (на основе gonvaled раствора)

read lines words chars <<< $(wc x)

Или в ш:

a=$(wc file.txt)
lines=$(echo $a|cut -d' ' -f1)
words=$(echo $a|cut -d' ' -f2)
chars=$(echo $a|cut -d' ' -f3)
13 голосов
/ 19 августа 2011

Существуют и другие решения, но я обычно использую простое решение - поместить вывод wc во временный файл, а затем прочитать оттуда:

wc file.txt > xxx
read lines words characters filename < xxx 
echo "lines=$lines words=$words characters=$characters filename=$filename"
lines=2 words=5 characters=23 filename=file.txt

Преимущество этого метода в том, чточто вам не нужно создавать несколько awk процессов, по одному для каждой переменной.Недостатком является то, что вам нужен временный файл, который вы должны затем удалить.

Будьте осторожны: это не работает:

wc file.txt | read lines words characters filename

Проблема в том, что конвейер к read создает другойпроцесс, и переменные там обновляются, поэтому они не доступны в вызывающей оболочке.

Редактировать: добавление решения с помощью arnaud576875:

read lines words chars filename <<< $(wc x)

Работает без записи в файл (и делатьнет проблем с трубой).Это зависит от bash.

Из руководства по bash:

Here Strings

   A variant of here documents, the format is:

          <<<word

   The word is expanded and supplied to the command on its standard input.

Ключ - бит "слово расширено".

4 голосов
/ 19 августа 2011

Просто чтобы добавить другой вариант -

set -- `wc file.txt`
chars=$1
words=$2
lines=$3

Это явно засоряет $* и связанные переменные. В отличие от некоторых других решений здесь, он переносим на другие оболочки Борна.

3 голосов
/ 18 октября 2018

Я хотел сохранить номер файла CSV в переменной. У меня сработало следующее:

CSV_COUNT=$(ls ./pathToSubdirectory | grep ".csv" | wc -l | xargs)
  • xargs удаляет пробелы из команды wc
  • Я запустил этот bash-скрипт не в той же папке, что и файлы csv. Таким образом, pathToSubdirectory
3 голосов
/ 19 августа 2011
lines=`wc file.txt | awk '{print $1}'`
words=`wc file.txt | awk '{print $2}'`
...

Вы также можете сначала сохранить результат wc где-нибудь .. а затем проанализировать его .. если вы придирчивы к производительности:)

0 голосов
/ 19 августа 2011
declare -a result
result=( $(wc < file.txt) )
lines=${result[0]}
words=${result[1]}
characters=${result[2]}
echo "Lines: $lines, Words: $words, Characters: $characters"
0 голосов
/ 19 августа 2011

Вы можете назначить вывод переменной, открыв вложенную оболочку:

$ x=$(wc some-file)
$ echo $x
1 6 60 some-file

Теперь, чтобы получить отдельные переменные, самый простой вариант - использовать awk:

$ x=$(wc some-file | awk '{print $1}')
$ echo $x
1
...