2011-12-13 19 views
6

To jest mój spróbuj zrobić toBash: Znajdź plik z max linii liczyć

  • Znajdź wszystkie *.java plików
    find . -name '*.java'
  • linie Hrabia
    wc -l
  • Usuń ostatnia linia
    sed '$d'
  • Użyj AWK, aby znaleźć maksymalne liczby linii w wc wyjściowe
    awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'

następnie połączyć je w jednym wierszu

find . -name '*.java' | xargs wc -l | sed '$d' | awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}' 

Mogę jakoś realizować licząc nie tylko puste wiersze?

+0

Twoje rozwiązanie prawdopodobnie się przewróci, gdy napotkasz nietypowe nazwy plików. Użyj '-print0' w' find' w połączeniu z opcją '-0' w' xargs', coś w tym stylu - find. -name '* .java' -print0 | xargs -0 wc -l | sort -n | ogon -2 | head -1' – potong

Odpowiedz

14
find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \; | \ 
    sort -nr -t":" -k2 | awk -F: '{print $1; exit;}' 

Wymień awk polecenie z numerem head -n1, jeśli chcesz zobaczyć liczbę niepustych wierszy.


Podział polecenia:

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) 
+0

Świetnie, bardziej mi się podoba, ponieważ ujawniła opcję 'find -exec', która jest bardziej przydatna niż zapętlenie –

+0

Nie może zawierać nazw plików zawierających dwukropki lub znaki nowej linii. –

0

Coś jak to może działać:

find . -name '*.java'|while read filename; do 
    nlines=`grep -v -E '^[[:space:]]*$' "$filename"|wc -l` 
    echo $nlines $filename 
done|sort -nr|head -1 

(edytowane zgodnie komentarzu Eda Mortona musi miałem zbyt wiele :-) kawy.)

+1

To się nie powiedzie w nazwach plików ze spacjami, a używanie 'eval' w ten sposób nie jest konieczne. – Sorpigal

+0

@holygeek - dlaczego twoim zdaniem eval był potrzebny? Pozbądź się eval i wszystkich uciekających i podaj nazwę $ filename, a ta linia przynajmniej "zadziała". –

5
find . -name "*.java" -type f | xargs wc -l|sort -rn|grep -v ' total$'|head -1 
+0

Nieźle, ale wymaga edycji, aby pokazać tylko plik z większością linii kodu, teraz pokazuje wszystkie pliki z ich numerami –

+0

tak .. masz rację.nie zapomniałeś dodać jeszcze jednej fajki.dodany teraz – Vijay

0

Aby uzyskać rozmiar wszystkich plików za pomocą awk jest po prostu:

$ 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 } 
' 

Aby uzyskać zliczania z niepustych wierszy , po prostu ustaw linię, w której zwiększasz rozmiar [] warunkowo:

$ 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 } 
' 

(. Jeśli rozważyć wiersze zawierające tylko spacje jako „pusty”, a następnie zastąpić NF z /^./)

Aby dostać tylko plik z najbardziej niepustych wierszy tylko podkręcić jeszcze:

$ 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 
} 
'