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щоб уникнути марного використання кота. Хоча ти абсолютно божевільний, якщо думаєш, що це вимагає будь-якого помітного часу.
Щоб це зробити без провідного простору, чому б не:
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виконує роботу точно і стисло.