linux 将大文件拆分为多个文件,但不使用case语句

kninwzqo  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(108)

我是bash脚本的新手,我正在尝试制作一个将一个大文件拆分为多个文件的脚本。我成功地使用了case语句,但没有case语句我怎么做呢?例如,如果我有一个有30百万行的文件(某个数据库文件)。提前感谢!

echo File which one you want to split
read pathOfFile
echo
countLines=`wc -l < $pathOfFile`
echo The file has $countLines lines
echo
echo In how many files do you want to split?
echo -e "a = 2 files\nb = 3 files\nc = 4 files\nd = 5 files\ne = 10 files\nf = 25 files"
read numberOfFiles
echo
echo The files name with should start:
read nameForFiles
echo

#Split the file
case $numberOfFiles in
a) split -l $(($countLines / 2)) $pathOfFile $nameForFiles;;
b) split -l $(($countLines / 3)) $pathOfFile $nameForFiles;;
c) split -l $(($countLines / 4)) $pathOfFile $nameForFiles;;
d) split -l $(($countLines / 5)) $pathOfFile $nameForFiles;;
e) split -l $(($countLines / 10)) $pathOfFile $nameForFiles;;
f) split -l $(($countLines / 25)) $pathOfFile $nameForFiles;;
*) echo Invalid choice.
esac
b4lqfgs4

b4lqfgs41#

您可以使用数组存储值,然后将字符转换为整数用作索引:

# ...

z=('2' '3' '4' '5' '10' '25')
x=$(( $(printf '%d' "'$numberOfFiles") -97 ))

if  [[ $x -lt "${#z[@]}" ]] && [[ $x -ge '0' ]] ; then
    split -l $(($countLines / ${z[x]})) $pathOfFile $nameForFiles
else
    echo "Invalid choice"
fi

如您所见,只需将字符转换为ascii,然后减去97,就可以确保索引行在数组z的范围内。

相关问题