wc -l file.txt
outputs number of lines and file name.
I need just the number itself (not the file name).
I can do this
wc -l file.txt | awk '{print $1}'
But maybe there is a better way?
wc -l file.txt
outputs number of lines and file name.
I need just the number itself (not the file name).
I can do this
wc -l file.txt | awk '{print $1}'
But maybe there is a better way?
Try this way:
wc -l < file.txt
wc -l
should not emit one, and why would ksh prepend the standard output of a program with a space? –
Tybie 4711 [stdin]
as the output. –
Tybie printf "%'d"
, which takes care of the space and prints out large numbers nicely. –
Hebel <
doing? –
Denadenae cat file.txt | wc -l
According to the man page (for the BSD version, I don't have a GNU version to check):
If no files are specified, the standard input is used and no file name is displayed. The prompt will accept input until receiving EOF, or [^D] in most environments.
wc -l < file.txt
has the same effect. –
Picaresque To do this without the leading space, why not:
wc -l < file.txt | bc
I had a similar issue attempting to get a character count without the leading whitespace provided by wc
, which led me to this page. After trying out the answers here, the following are the results from my personal testing on Mac (BSD Bash). Again, this is for character count; for line count you'd do wc -l
. echo -n
omits the trailing line break.
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" (√)
I wouldn't rely on the cut -f*
method in general since it requires that you know the exact number of leading spaces that any given output may have. And the grep
one works for counting lines, but not characters.
bc
is the most concise, and awk
and perl
seem a bit overkill, but they should all be relatively fast and portable enough.
Also note that some of these can be adapted to trim surrounding whitespace from general strings, as well (along with echo `echo $FOO`
, another neat trick).
echo $(printf '%s' "$FOO" | wc -c)
is one of the rare occasions when echo
with a command subshitution isn't useless. –
Gine echo `echo $FOO`;
also acts like a String.trim() command on a variable! That's amazingly handy. I'll also add your line to my answer. –
Zecchino printf
better than echo
? –
Gine How about
wc -l file.txt | cut -d' ' -f1
i.e. pipe the output of wc
into cut
(where delimiters are spaces and pick just the first field)
wc -l file.txt | awk '{print $1}'
OP tried. –
Cowbell wc -l < file.txt
method. But must use | cut -d' ' -f2
on BSD, as long as the wc
command returns a leading space, example: " 34068289 file.txt", instead of "34068289 file.txt". –
Dorris How about
grep -ch "^" file.txt
grep
but checking this it turns out (unsurprisingly) to be 2x to 6x slower than the simpler/straightforward wc
method in my tests. –
Flats Another way to strip the leading zeros without invoking an external command is to use Arithmetic expansion $((exp))
echo $(($(wc -l < file.txt)))
Obviously, there are a lot of solutions to this. Here is another one though:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
This only outputs the number of lines, but the trailing newline character (\n
) is present, if you don't want that either, replace [:blank:]
with [:space:]
.
test9
with 1 line in it, the output will be 19. –
Lassitude Best way would be first of all find all files in directory then use AWK NR (Number of Records Variable)
below is the command :
find <directory path> -type f | awk 'END{print NR}'
example : - find /tmp/ -type f | awk 'END{print NR}'
This works for me using the normal wc -l
and sed
to strip any char what is not a number.
wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"
# 9249133
© 2022 - 2024 — McMap. All rights reserved.
wc -l < file.txt
does the job precisely and concisely. – Gnosticwc
with multiple arguments (`wc -l *.txt) in which case you will get a line for each file and need to distinguish them. – Come