2012-02-27 4 views
3

Я пытаюсь поместить количество строк в файл в целочисленную переменную.Переменная для количества строк в файле

Это, как я это делаю

typeset -i x 
x=`wc -l $1` 

где $ 1 является в командной строке ARG

Проблема заключается в том, что туалет -l дает номер и имя файла, как: 5-бла

Есть ли способ только поставить число в x?

ответ

6

Вместо этого вы можете сделать cat $1 | wc -l.

or wc -l $1 | cut -d " " -f 1.

+0

Спасибо! Можете ли вы объяснить, как 'cat $ 1 | wc -l' работает? Если вы не возражаете – JA3N

+0

Не сомневайтесь, что Oli обновит ответ, но в основном это означает, что если 'wc' не знает имя своего входного файла (например, когда вход поступает через стандартный ввод), это не означает, t распечатать его. – paxdiablo

1

Или с sed ...

wc -l $1 | sed 's/^ *\([0-9]*\).*$/\1/' 

Или, предполагая, что первое пространство является один за номером:

wc -l $1 | sed 's/ .*$//' 
+0

Хм, а не как _readable_, как и другие, но я пообещал себе, что буду предлагать любое решение, использующее два или менее процесса :-) Возможно, проще было просто удалить из первого пространства вперед: 's /. * $ // 'вместо использования замены регистров. – paxdiablo

+0

: D спасибо ... теперь, когда я вижу другие ответы, они кажутся уродливыми, но это было первое, что появилось в моей голове. Строка начинается с пробелов, поэтому удаление из первого пространства не будет работать. – mVChr

+0

Выход 'wc' начинается с пробелов? На какой ОС вы работаете? Мой сидит на одном уровне с левым. – paxdiablo

0

Вы можете использовать shell, чтобы удалить имя файла. Это имеет то преимущество, что не начала 2-го процесса, как cat, cut, sed или awk:

var=$(wc -l _your_file_) 
nb_lines=${var%% *} 

Вы также можете переписать nb_lines=${var%% *} с nb_lines=${var/ */}, but the 2nd form is less portable being bash` конкретные.

Update

Я прочитал выше, что выход некоторых wc «s начинаются с пробела, поэтому выше можно переписать:

#var=$(wc -l _your_file_) 
var=" 3 file" 
var=$(echo $var) 
nb_lines=${var%% *} 

Использование echo, чтобы избавиться от лишних пробелов.

8
x=$(wc -l < "$1") 

Это позволяет избежать бесполезного использования cat и любых вилок, и будет работать на путь, содержащий пробелы и даже новой строки.

Смежные вопросы