i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
これほど複雑なことはないと思います-ファイル名を並べ替えて、すでに大変な作業を行っています。すべてを同時に開かないでください。
別の方法:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
...しかし、それはそれらを逆方向に行うと思います...これはもっとうまくいくかもしれません:
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
そして、もう一つの方法があります:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
これによりtar
、すべてのファイルをヌル区切りのストリームに収集し、ファイル名を除くすべてのヘッダーメタデータを解析し、すべてのファイルのすべての行をタブに変換できます。ただし、入力は実際のテキストファイルであることに依存します。つまり、それぞれが改行で終了し、ファイルにヌルバイトがないことを意味します。また、ファイル名自体が改行なしであることにも依存します(ただし、GNU tar
の--xform
オプションを使用すると堅牢に処理される可能性があります)。これらの条件が満たされている場合、任意の数のファイルの非常に短い作業を行う必要があります-とtar
ほぼすべての処理を実行します。
結果は、次のような一連の行です。
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
等々。
最初に5つのテストファイルを作成してテストしました。今は10000個のファイルを生成する気分になれなかったので、それぞれについてもう少し大きくしました。また、ファイルの長さが大きく異なることを確認しました。tar
スクリプトをテストする場合、これは重要です。なぜなら、tar
入力を固定長にブロックするです-少なくともいくつかの異なる長さを試さないと、実際に1つだけを処理するかどうかわかりません。
とにかく、私がしたテストファイルについて:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
後に報告された:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
...それから私は走った...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... 各行が最初の25個のタブ区切りフィールドのみを表示するようにします(各ファイルは単一行であるため- たくさんあります) ...
出力は次のとおりです。
./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
オプションを使用してみましたpaste
か?