Bash 从 split 命令计算字母后缀(即以字母为基数的 26 整数)

Bash compute the letter suffix from the split command (i.e. integer into base 26 with letters)

split 命令默认生成格式为“aa”“ab”...“by”“bz”...的文件后缀...

但是在脚本中,我需要恢复这个后缀,从文件号开始作为一个整数(没有 globbing)。

我写了下面的代码,但也许bash这里的向导有更简洁的解决方案?

alph="abcdefghijklmnopqrstuvwxyz"
for j in {0..100}; do
    # Convert j to the split suffix (aa ab ac ...)
    first=$(( j / 26 ))    
    sec=$(( j % 26 ))
    echo "${alph:$first:1}${alph:$sec:1}"
done

或者,我可以将 bcobase 变量一起使用,但它仅在 j<26.

的情况下输出一个数字
bc <<< 'obase=26; 5'
# 05
bc <<< 'obase=26; 31'
# 01 05

从我的头顶开始,取决于 97 beeing ASCII a:

printf "\x$(printf %x $((97+j/26)))\x$(printf %x $((97+j%26)))\n"
printf "\$(printf %o $((97+j/26)))\$(printf %o $((97+j%26)))\n"
awk "BEGIN{ printf \"%c%c\n\", $((97+j/26)), $((97+j%26))}" <&-
printf %x $((97+j/26)) $((97+j%26)) | xxd -r -p

你也可以只写没有临时变量:

echo "${alph:j/26:1}${alph:j%26:1}"

In my use case, I do want to generate the full list

awk应该很快:

awk 'BEGIN{ for (i=0;i<=100;++i) printf "%c%c\n", 97+i/26, 97+i%26}' <&-

使用此 Perl 单行代码并指定文件编号(从 0 开始索引)作为参数,例如:

perl -le 'print for ("aa".."zz")[@ARGV]' 0 25 26

输出:

aa
az
ba

Perl 单行代码使用这些命令行标志:
-e : 告诉 Perl 查找内联代码,而不是在文件中。
-l : 在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上为 "\n"),并在打印时附加它。

@ARGV : 命令行参数数组。