wc -l file.txt
выводит количество строк и имя файла.
Мне нужен только сам номер (не имя файла).
я могу это сделать
wc -l file.txt | awk '{print $1}'
Но может быть, есть лучший способ?
wc -l file.txt
выводит количество строк и имя файла.
Мне нужен только сам номер (не имя файла).
я могу это сделать
wc -l file.txt | awk '{print $1}'
Но может быть, есть лучший способ?
Ответы:
Попробуйте так:
wc -l < file.txt
wc -l
не должен испускать один, и почему бы ksh ставить перед стандартным выводом программы пробел?
4711 [stdin]
в качестве вывода.
printf "%'d"
, которое заботится о пространстве и красиво печатает большие числа.
cat file.txt | wc -l
Согласно странице руководства (для версии BSD у меня нет версии GNU для проверки):
Если файлы не указаны, используется стандартный ввод и имя файла не отображается. Подсказка будет принимать ввод до получения EOF или [^ D] в большинстве сред.
wc -l < file.txt
имеет тот же эффект.
wc -l < file.txt
чтобы избежать ненужного использования cat. Хотя вы абсолютно безумны, если думаете, что это занимает какое-то заметное время.
Чтобы сделать это без пробела, почему бы не:
wc -l < file.txt | bc
wc -l < file.txt
чтобы исправить ошибку разбора и удалить пробел:wc -l < file.txt | bc
Как насчет
wc -l file.txt | cut -d' ' -f1
т.е. передать вывод wc
в cut
(где разделители являются пробелами и выбрать только первое поле)
wc -l file.txt | awk '{print $1}'
пытался ОП.
wc -l < file.txt
метод. Но необходимо использовать | cut -d' ' -f2
в BSD, пока wc
команда возвращает начальный пробел, например: «34068289 file.txt» вместо «34068289 file.txt».
У меня была похожая проблема, когда я пытался получить количество символов без начального пробела wc
, что привело меня к этой странице. После опробования ответов ниже приведены результаты моего личного тестирования на Mac (BSD Bash). Опять же, это для подсчета символов; для подсчета строк вы бы сделали wc -l
. echo -n
пропускает разрыв задней линии.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Я бы не стал полагаться на cut -f*
метод в целом, так как он требует, чтобы вы знали точное число начальных пробелов, которое может иметь любой заданный вывод. И тот, grep
который работает для подсчета строк, но не символов.
bc
является наиболее кратким awk
и, perl
кажется, немного излишним, но все они должны быть относительно быстрыми и достаточно портативными.
Также обратите внимание, что некоторые из них могут быть адаптированы для обрезки окружающих пробелов из общих строк, а также ( echo `echo $FOO`
еще один аккуратный трюк).
echo $(printf '%s' "$FOO" | wc -c)
это один из тех редких случаев, когда echo
команда заменяется бесполезно.
echo `echo $FOO`;
также действует как команда String.trim () для переменной! Это удивительно удобно. Я также добавлю вашу строку в мой ответ.
printf
лучше чем echo
?
Очевидно, есть много решений для этого. Вот еще один, хотя:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Выводит только количество строк, но присутствует символ новой строки ( \n
), если вы этого не хотите, замените [:blank:]
на [:space:]
.
test9
с 1 строкой вывод будет 19.
Лучше всего было бы сначала найти все файлы в каталоге, а затем использовать AWK NR (переменная количества записей)
ниже команда:
find <directory path> -type f | awk 'END{print NR}'
пример : - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
выполняет работу точно и кратко.