
¿Cómo enumerar todos los archivos .txt (archivo delimitado por barras verticales) y el número de columnas de cada archivo en un directorio?
Respuesta1
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
FNR == 1 {print FILENAME ": " NF; nextfile}' {} +
Imprimiría algo como
./dir/foo.txt: 2
para cada archivo normal no vacío cuyo nombre termine en .txt
donde "2"
está el número de |
campos separados en la primera línea del archivo.
Tenga en cuenta que nextfile
no está disponible en todas awk
las implementaciones, pero en aquellas donde no lo está, debería ser inofensivo (solo menos eficiente, ya que awk
leería los archivos por completo).
Si desea considerar solo los archivos que tienen el mismo número de columnas en todas sus líneas no vacías, con GNU awk
:
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
BEGINFILE {n = 0}
NF {
if (n && NF != n) {
print "skipping "FILENAME" ("NF" != "n")" > "/dev/stderr"
n = 0; nextfile
}
n = NF
}
ENDFILE {if (n) print FILENAME ": " n}' {} +
Respuesta2
Otro enfoque para cualquierawkimplementación:
find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;
-F'|'
- tratar|
como separador de campoNF{ ... }
- garantiza que haya al menos un campo/columna en el archivo.NF
apunta al número de columnas
Respuesta3
find . -name "*.txt" -type f -exec wc -l {} \;
Respuesta4
Su pregunta no es muy clara, pero puede probar este comando:
find DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }"
simplemente reemplace DIRECTORY
y SEPARATOR
con su directorio y separador de columnas.