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выполняет работу точно и кратко.