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
它将阻止输入固定长度的内容-如果您不尝试至少几种不同的长度,您将永远不知道是否实际上只处理一个长度。
无论如何,对于测试文件,我做了:
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
命令一起使用?