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
виконує роботу точно і стисло.