Gerar listas de números de página para impressão duplex 2-up: 2,3,… e 1,4,…

3

Como posso gerar os seguintes incrementos?

2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,...,135

e

4,5,8,9,12,13,16,17,20,21,24,25,28,29,32,33,36,37,40,41,44,45,48,49,...,137

Eles são necessários ao imprimir páginas. Eu posso criar incrementalmente contando "one liners" no bash, mas não posso escrever um para isso. Alguém pode me ajudar?

    
por LanceBaynes 12.11.2011 / 06:35

4 respostas

2

Isso funciona. Salve-o em increment.bash e digite bash increment.bash 2 para obter o incremento começando em 2 ou bash increment.bash 4 para iniciar em 4. Começará em 2 se nenhum for definido. (Fiz alguns refinamentos para onde o anterior realmente funciona)

#!/bin/bash

if [ $1 ]; then
    opt=$1
    if [ $opt == "--help" ]; then echo "Usage: $0 [2|4] -- either starting number 2 or 4, to print first number and +1, increment by 3, then continue."; exit 0
    elif [ $opt == 2 ]; then i=$opt
    elif [ $opt == 4 ]; then i=$opt
    fi
else i=2
fi

echo $i; let i++; echo $i;

for (( n=1; $n < 35; n++ )); do
    if [ $i == 135 ] || [ $i == 137 ]; then break; fi
    i=$[i+3]; echo "$i";
    let i++; echo "$i";
done

Aqui está em ação:

$ for i in {2..4..2}; do for type in head tail; do echo ":: $i | $type :: "; bash increment.bash $i | $type; done; done
:: 2 | head :: 
2
3
6
7
10
11
14
15
18
19
:: 2 | tail :: 
118
119
122
123
126
127
130
131
134
135
:: 4 | head :: 
4
5
8
9
12
13
16
17
20
21
:: 4 | tail :: 
120
121
124
125
128
129
132
133
136
137
    
por 12.11.2011 / 07:50
3

Não sei exatamente o que você está tentando fazer, mas fazer algo que conta apenas essa sequência é bem simples:

i=2 # or 4
while true; do
    echo $i
    i=$(($i+1))
    echo $i
    i=$(($i+3))
done
    
por 12.11.2011 / 07:50
1

Usando o GNU sed para sua BEGIN ~ STEP opiton.

printf "%s\n" {1..137} |tee \
    >(sed -nr '2~4H; 3~4H; ${g; s/\n/,/g; s/^,(.*)//p}'>set23) |
      sed -nr '4~4H; 5~4H; ${g; s/\n/,/g; s/^,(.*)//p}'>set45
cat set23
cat set45

Saída

2,3,6,7,10,11,14,15, ... ,130,131,134,135
4,5,8,9,12,13,16,17, ... ,132,133,136,137 
    
por 12.11.2011 / 12:22
0

Aqui está uma maneira de criar essas listas de números: passe pelos números de 1 a $n e anexe-os a qualquer lista apropriada. O snippet abaixo usa apenas construções portáteis.

recto= verso= i=1
while [ $i -le $n ]; do
  if [ $((i % 4)) -le 1 ]; then recto=$recto,$i; else verso=$verso,$i; done
  i=$((i + 1))
done
recto=${recto%,} verso=${verso%,}

Aqui está uma versão do ksh / bash / zsh:

recto= verso=
for ((i=1; i<n; i++)); do
  if ((i % 4 <= 1)); then recto=$recto,$i; else verso=$verso,$i; done
done
recto=${recto%,} verso=${verso%,}
    
por 12.11.2011 / 22:46