Reputation: 40661
This is my try to do it
*.java
filesfind . -name '*.java'
wc -l
sed '$d'
wc
outputawk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'
then merge it to single line
find . -name '*.java' | xargs wc -l | sed '$d' | awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'
Can I somehow implement counting just non-blank lines?
Upvotes: 13
Views: 8596
Reputation: 67291
find . -name "*.java" -type f | xargs wc -l | sort -rn | grep -v ' total$' | head -1
Upvotes: 18
Reputation: 16185
Something like this might work:
find . -name '*.java'|while read filename; do
nlines=`grep -v -E '^[[:space:]]*$' "$filename"|wc -l`
echo $nlines $filename
done|sort -nr|head -1
(edited as per Ed Morton's comment. I must have had too much coffee :-) )
Upvotes: 0
Reputation: 203985
To get the size of all of your files using awk is just:
$ find . -name '*.java' -print0 | xargs -0 awk '
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 }
{ size[FILENAME]++ }
END { for (file in size) print size[file], file }
'
To get the count of the non-empty lines, simply make the line where you increment the size[] conditional:
$ find . -name '*.java' -print0 | xargs -0 awk '
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 }
NF { size[FILENAME]++ }
END { for (file in size) print size[file], file }
'
(If you want to consider lines that contain only blanks as "empty" then replace NF with /^./.)
To get only the file with the most non-empty lines just tweak again:
$ find . -name '*.java' -print0 | xargs -0 awk '
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 }
NF { size[FILENAME]++ }
END {
for (file in size) {
if (size[file] >= maxSize) {
maxSize = size[file]
maxFile = file
}
}
print maxSize, maxFile
}
'
Upvotes: 0
Reputation: 86924
find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \; | \
sort -nr -t":" -k2 | awk -F: '{print $1; exit;}'
Replace the awk
command with head -n1
if you also want to see the number of non-blank lines.
Breakdown of the command:
find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \;
'---------------------------' '-----------------------'
| |
for each *.java file Use grep to count non-empty lines
-H includes filenames in the output
(output = ./full/path/to/file.java:count)
| sort -nr -t":" -k2 | awk -F: '{print $1; exit;}'
'----------------' '-------------------------'
| |
Sort the output in Print filename of the first entry (largest count)
reverse order using the then exit immediately
second column (count)
Upvotes: 26