Bash 如何使用FOR循环将多行(例如1-10、11-20等)从一个大文件顺序复制到其他多个文件(可能是sed或awk)?
我不熟悉Bash和Linux。我正在努力让它在Bash中实现。到目前为止,我的代码看起来像这样: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" 我
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"