Bash 如何使用FOR循环将多行(例如1-10、11-20等)从一个大文件顺序复制到其他多个文件(可能是sed或awk)?

Bash 如何使用FOR循环将多行(例如1-10、11-20等)从一个大文件顺序复制到其他多个文件(可能是sed或awk)?,bash,awk,sed,Bash,Awk,Sed,我不熟悉Bash和Linux。我正在努力让它在Bash中实现。到目前为止,我的代码看起来像这样: awk -v i="$i" 'NR>=1+i*9 && NR<=(i+1)*9' /path/BigFile > "/path/file$i" sed -n "$((1+i*9)),$(((i+1)*9)) p" /path/BigFile > "/path/file$i" 我

我不熟悉Bash和Linux。我正在努力让它在Bash中实现。到目前为止,我的代码看起来像这样:

awk -v i="$i" 'NR>=1+i*9 && NR<=(i+1)*9' /path/BigFile > "/path/file$i"
sed -n "$((1+i*9)),$(((i+1)*9)) p" /path/BigFile > "/path/file$i"
我想,问题在于如何使用awk或sed来应对。。。当我试图把一个常数和一个变量的和放错的时候。括号或不同的引号没有任何区别

for i in {0..10}
do
    touch /path/file$i
    awk -v "NR>=1+$i*9 && NR<=$i*9" /path/BigFile > /path/file$i
    (or with sed) sed -n "1+$i*9,$i*9" /path/BigFile > /path/file$i
done
{0..10}中i的

做
触摸/路径/文件$i

awk-v“NR>=1+$i*9&&NR您可以使用
split
实用程序,而不是重新设计这个轮子。
split-l 10
将告诉它拆分成10行的块(最后一行可能更少),您可以使用一些选项来控制输出文件名——您可能希望
-d
获得数字后缀(默认值为字母顺序)。

您可以使用
split
实用程序,而不是重新设计此控制盘。
split-l 10
将告诉它拆分成10行的块(最后一行可能更少),您可以使用一些选项来控制输出文件名--您可能希望
-d
获得数字后缀(默认为字母顺序)。

霍布斯的答案(使用
拆分
)是解决此问题的正确方法。除了简单之外,它也是线性的(这意味着如果将输入大小增加一倍,它只需要两倍的时间)而这些
for
循环是(将输入时间增加一倍,所需时间增加四倍),再加上循环要求您提前知道文件中有多少行。但为了完整性,让我解释一下最初尝试中出现的错误

主要的问题是数学是错误的。
NR>=1+$i*9&&NR=1&&NR=10&&NR=1+$i*9&&NRhobbs的答案(使用
split
)是解决这个问题的正确方法。除了更简单之外,它也是线性的(意味着如果你将输入大小增加一倍,只需要两倍的时间),而这些
的循环是(将输入翻倍,所需时间翻倍),再加上循环要求您提前知道文件中有多少行。但为了完整性,让我解释一下最初尝试中出现的错误


主要问题是数学是错误的。
NR>=1+$i*9&&NR=1&&NR=10&&NR=1+$i*9&&NRTry:
split-l10 BigFile
。因为堆栈溢出是专业和热心程序员的问答网站:1.在awk程序周围使用单引号(
),而不是双引号(
).2.在awk中引入和使用变量:
awk-vvar=$i'NR>=1*var*9…
3.
i
的任何正值都不能满足:
NR>=1+i*9&&NRTry:
split-l10 BigFile
。因为堆栈溢出是专业和热心程序员的问答网站:1.使用单引号(
)围绕awk程序,而不是双引号(
)。2.在awk中引入和使用变量:
awk-v var=$i'NR>=1*var*9…“
3.
i
的正值不能满足:
NR>=1+i*9&&NR
sed "$((1+i*9)),$(((i+1)*9)) ! d" /path/BigFile > "/path/file$i"