i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
No creo que esto sea tan complicado como todo eso: ya has hecho el trabajo duro ordenando los nombres de archivo. Simplemente no los abras a todos al mismo tiempo, eso es todo.
De otra manera:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... pero creo que eso los hace al revés ... Esto podría funcionar mejor:
i=0; echo 'while paste \'
until [ "$((i+=1))" -gt 1023 ] &&
printf '%s\n' '"${1024}"' \
do\ shift\ 1024 done
do echo '"${'"$i"'-/dev/null}" \'
done | sh -s -- ./res.* >outfile
Y aquí hay otra forma:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Eso permite tar
reunir todos los archivos en una secuencia delimitada por nulos, analiza todos sus metadatos de encabezado pero el nombre de archivo y transforma todas las líneas en todos los archivos en pestañas. Sin embargo, se basa en que la entrada es archivos de texto reales, lo que significa que cada uno termina con una nueva línea y no hay bytes nulos en los archivos. Ah, y también depende de que los nombres de los archivos estén libres de nueva línea (aunque eso podría manejarse de manera sólida con tar
la --xform
opción de GNU ) . Dado que se cumplen estas condiciones, debería hacer un trabajo muy corto de cualquier número de archivos, ytar
lo hará casi todo.
El resultado es un conjunto de líneas que se ven así:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
Y así.
Lo probé creando primero 5 archivos de prueba. Realmente no tenía ganas de generar archivos 10000 en este momento, así que solo fui un poco más grande para cada uno, y también me aseguré de que las longitudes de los archivos diferían en gran medida. Esto es importante cuando se prueban tar
scripts porquetar
bloqueará la entrada a longitudes fijas; si no prueba al menos algunas longitudes diferentes, nunca sabrá si realmente manejará solo una.
De todos modos, para los archivos de prueba que hice:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
luego informó:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... entonces corrí ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... solo para mostrar solo los primeros 25 campos delimitados por tabulaciones por línea (porque cada archivo es una sola línea, hay muchos ) ...
El resultado fue:
./1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
--serial
opción con elpaste
comando?