2011-12-13 16 views
6

Esta es mi oportunidad de hacerloBash: encontrar el archivo con las líneas max contar

  • Encuentra todos los *.java archivos
    find . -name '*.java'
  • líneas Count
    wc -l
  • Borrar última línea
    sed '$d'
  • Utilice AWK para encontrar recuentos máximos de líneas en wc salida
    awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'

luego fusionar a sola línea

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

¿Hay algún modo poner en práctica contando líneas simplemente no están en blanco?

+0

Es probable que su solución caiga al encontrar nombres de archivos inusuales. Use '-print0' en' find' junto con la opción '-0' en' xargs', algo como esto - 'find. -name '* .java' -print0 | xargs -0 wc -l | ordenar -n | cola -2 | head -1' – potong

Respuesta

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

Vuelva a colocar la awk comando con head -n1 si también desea ver el número de líneas no en blanco.


Desglose del comando:

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

Genial, me gusta más, porque reveló la opción 'find -exec', que es más útil que el bucle –

+0

Fallaría en los nombres de archivo que contienen dos puntos o líneas nuevas. –

0

Algo como esto podría funcionar:

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

(editado de acuerdo con el comentario de Ed Morton Debo haber tenido demasiado :-) café.)

+1

Esto fallará en los nombres de archivos con espacios, entre otras cosas, y el uso de 'eval' de esta manera no es necesario. – Sorpigal

+0

@holygeek: ¿por qué crees que eval era necesario? Deshazte de la evaluación y de todo el escape y cita $ filename y esa línea al menos "funcionará". –

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

No está mal, pero necesita editar para mostrar solo el archivo con la mayoría de las líneas de código, ahora muestra todos los archivos con sus recuentos –

+0

, sí ... tienes razón. Simplemente se me olvidó agregar una pipa más.agregado ahora – Vijay

0

para obtener el tamaño de todos los archivos que utilizan awk es simplemente:

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

para obtener el recuento de las líneas no vacías , simplemente haga que la línea donde incremente el tamaño [] condicional:

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

(. Si usted desea considerar las líneas que sólo contienen espacios en blanco como "vacío", entonces reemplazar NF con /^./)

para obtener sólo el archivo con las líneas más no vacías simplemente ajustar de nuevo:

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