Domanda

For printing number of lines in all ".txt" files of current folder, I am using following script:

for f in *.txt;
do l="$(wc -l "$f")";
echo "$f" has "$l" lines;
done 

But in output I am getting:

lol.txt has 2 lol.txt lines

Why is lol.txt printed twice (especially after 2)? I guess there is some sort of stream flush required, but I dont know how to achieve that in this case.So what changes should i make in the script to get the output as :

lol.txt has 2 lines
È stato utile?

Soluzione

You can remove the filename with 'cut':

for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done 

Altri suggerimenti

The filename is printed twice, because wc -l "$f" also prints the filename after the number of lines. Try changing it to cat "$f" | wc -l.

wc prints the filename, so you could just write the script as:

ls *.txt | while read f; do wc -l "$f"; done

or, if you really want the verbose output, try

ls *.txt | while read f; do wc -l "$f" | awk '{print $2, "has", $1, "lines"}'; done

There is a trick here. Get wc to read stdin and it won't print a file name:

for f in *.txt; do
    l=$(wc -l < "$f")
    echo "$f" has "$l" lines
done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top