Size: 833
Comment: Hello, Admin! You are the best!!! Congratulations. recipe toasted marshmallows So it goes. http://arradn.psend.com/recipe3528.html hawaii cold soba recipe voice, http://arradn.servik.com/recipe2044.ht
|
Size: 1733
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
[[Anchor(faq19)]] == How can I split a file into line ranges, e.g. lines 1-10, 11-20, 21-30? == Some Unix systems provide the {{{split}}} utility for this purpose: |
|
Line 2: | Line 5: |
---- /!\ '''Edit conflict - other version:''' ---- Hello, Admin! You are the best!!! Congratulations. recipe toasted marshmallows So it goes. http://arradn.psend.com/recipe3528.html hawaii cold soba recipe voice, http://arradn.servik.com/recipe2044.html canelle recipe face, http://arradn.psend.com/recipe1261.html alamo tamale recipes, Thanks for your work, admin! ---- CategoryHomepage |
{{{ split --lines 10 --numeric-suffixes input.txt output- }}} |
Line 7: | Line 9: |
---- /!\ '''Edit conflict - your version:''' ---- Hello, Admin! You are the best!!! Congratulations. recipe toasted marshmallows So it goes. http://arradn.psend.com/recipe3528.html hawaii cold soba recipe voice, http://arradn.servik.com/recipe2044.html canelle recipe face, http://arradn.psend.com/recipe1261.html alamo tamale recipes, Thanks for your work, admin! ---- CategoryHomepage |
For more flexibility you can use {{{sed}}}. The {{{sed}}} command can print e.g. the line number range 1-10: {{{ sed -n -e '1,10p' -e '10q' }}} |
Line 12: | Line 14: |
---- /!\ '''End of edit conflict''' ---- | This stops {{{sed}}} from printing each line ({{{-n}}}). Instead it only processes the lines in the range 1-10 ("1,10"), and prints them ("p"). The command will quit after reading line 10 ("10q"). We can now use this to print an arbitrary range of a file (specified by line number): {{{ # POSIX shell file=/etc/passwd range=10 cur=1 last=$(wc -l < "$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" > chunk.$(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: {{{ # legacy Bourne shell; assume no printf either file=/etc/passwd range=10 cur=1 last=`wc -l < "$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: {{{ awk -v range=10 '{print > FILENAME "." (int((NR -1)/ range)+1)}' file }}} |
How can I split a file into line ranges, e.g. lines 1-10, 11-20, 21-30?
Some Unix systems provide the split utility for this purpose:
split --lines 10 --numeric-suffixes input.txt output-
For more flexibility you can use sed. The sed command can print e.g. the line number range 1-10:
sed -n -e '1,10p' -e '10q'
This stops sed from printing each line (-n). Instead it only processes the lines in the range 1-10 ("1,10"), and prints them ("p"). The command will quit after reading line 10 ("10q").
We can now use this to print an arbitrary range of a file (specified by line number):
# POSIX shell file=/etc/passwd range=10 cur=1 last=$(wc -l < "$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" > chunk.$(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:
# legacy Bourne shell; assume no printf either file=/etc/passwd range=10 cur=1 last=`wc -l < "$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:
awk -v range=10 '{print > FILENAME "." (int((NR -1)/ range)+1)}' file