<> == How can I split a file into line ranges, e.g. lines 1-10, 11-20, 21-30? == POSIX specifies the {{{split}}} utility, which can be used for this purpose: {{{#!highlight bash split -l 10 input.txt }}} For more flexibility you can use {{{sed}}}. The {{{sed}}} command can print e.g. the line number range 1-10: {{{#!highlight bash sed 10q # Print lines 1-10 and then quit. sed '1,5d; 10q' # Print just lines 6-10 by filtering the first 5 then quitting after 10. }}} The `d` command stops {{{sed}}} from printing each line. This could alternatively have been done by passing sed the `-n` option and printing lines with the `p` command rather than deleting them with `d`. It makes no difference. We can now use this to print an arbitrary range of a file (specified by line number): {{{#!highlight bash # POSIX shell file=/etc/passwd range=10 cur=1 last=$(awk 'END { print NR }' < "$file") # count number of lines chunk=1 while [ "$cur" -lt "$last" ] do endofchunk=$((cur + range - 1)) sed -n -e "$cur,${endofchunk}p" -e "${endofchunk}q" "$file" > c"hunk.$(printf %04d "$chunk")" chunk=$((chunk + 1)) cur=$((cur + range)) done }}} The previous example uses POSIX [[ArithmeticExpression|arithmetic]], which older [[BourneShell|Bourne shells]] do not have. In that case the following example should be used instead: {{{#!highlight bash # legacy Bourne shell; assume no printf either file=/etc/passwd range=10 cur=1 last=`awk 'END { print NR }' < "$file"` # count number of lines chunk=1 while test "$cur" -lt "$last" do endofchunk=`expr $cur + $range - 1` sed -n -e "$cur,${endofchunk}p" -e "${endofchunk}q" "$file" > "chunk.$chunk" chunk=`expr "$chunk" + 1` cur=`expr "$cur" + "$range"` done }}} Awk can also be used to produce a more or less equivalent result: {{{#!highlight bash awk -v range=10 '{print > FILENAME "." (int((NR -1)/ range)+1)}' file }}} ---- CategoryShell