.png)
Quero produzir a seguinte lista de páginas (para trabalho de imposição); (o número de páginas é variável, mas faço uma amostra das minhas necessidades usando uma lista de 16 páginas, a lógica é a mesma para listas mais longas)
1,16
8,9
15,2
10,7
3,14
6,11
13,4
12,5
Eu escrevi isso para o ciclo:
for ((x=16, y=1, z=8, w=9;x>=4, y<=4, z>=12, w<=12;x--, y++, z--, w++)); do echo "$x $y;$z $w"; done | tr ";" "\n" | tr " " ","
que, no entanto, produz:
16,1
8,9
15,2
7,10
14,3
6,11
13,4
5,12
e não a lista de páginas que desejo. Então, eu preciso, com awk ou outros comandos, trocar campos em algumas colunas seguindo este padrão (repetindo a cada 4 páginas)
trocar campos
sem campos de troca
sem campos de troca
trocar campos
16,1 (swap: becomes: 1,16
8,9 (no swap: remains 8,9
15,2 (no swap: remains 15,2
7,10 (swap: becomes: 10,7
14,3 (swap: becomes: 3,14
6,11 (no swap: remains 6,11
13,4 (no swap: remains 13,4
5,12 (swap: becomes: 12,5
generalizando a lógica dessa imposição (preciso impor uma única cópia de um livro A6 em uma página A4) escrevi um roteiro mais generalizado
#!/bin/sh
pages=$1
halfpages="`let DIVISION=$pages/2; echo $DIVISION`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/4" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-$dividedby4" |bc -l)"
u="u"
for ((x=$pages, y=1, z=$halfpages, w=$incr;x>=4, y<=4, z>=$lastupperpage, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | tr "\n" ","
exit 0
no entanto, só consigo produzir:
16u,1u,8,9,15u,2u,7,10,14u,3u,6,11,13u,4u,5,12
em vez de certo:
1u,16u,8,9,15u,2u,10,7,3u,14u,6,11,13u,4u,12,5
que eu passeMultivalente.jar
Anexo uma imagem da imposição correta de um A6 em um A4 para mostrar a sequência correta de imposição
o que tento obter é uma maneira de impor um livro A6 inteiro em uma página A4 emUMassinatura composta por todas as suas páginas (não a Imposição de 8 páginas), para cortar meia página A4, fechar as duas metades uma sobre a outra, inverter a folha obtida, cortar ao meio e aplicar cola na borda esquerda para aplicar capa
para executar esta tarefa eu preciso repensar meu script do zero ou encontrar uma maneira de trocar campos em colunas por um padrão fixo (swap, no swap, no swap, swap) para corrigir a ordem errada produzida pelo meu script
EDITAR
resolvi enviar a saída padrão do script para o awk com esta sintaxe:
awk -F "," '{
print $2 "," $1;
getline; print;
getline; print;
getline; print $2 "," $1
}'
Responder1
O script a seguir é uma maneira muito mais limpa de obter a saída desejada.
#!/usr/bin/env bash
(($# == 0)) && {
echo "Usage: $0 <page_count>"
exit 1
} >&2
# nTotal = $1 rounded up to a multiple 8
nTotal=$(($1 + 7))
nTotal=$((nTotal - nTotal % 8))
nHalf=$((nTotal / 2))
nQuarter=$((nTotal / 4))
# print page numbers in groups of 4, 2 groups at a time
for ((x=0; x < nQuarter; x+=2)); do
printf '%du,%du\n%d,%d\n' \
$((x + 1)) $((nTotal - x)) $((nHalf - x)) $((nHalf + x + 1))
printf '%du,%du\n%d,%d\n' \
$((nTotal - (x + 1))) $((x + 2)) \
$((nHalf + x + 2)) $((nHalf - x - 1))
done
Exemplo
$ ./imposition8 16
1u,16u
8,9
15u,2u
10,7
3u,14u
6,11
13u,4u
12,5
Reescrevi seu roteiro porque houve vários problemas com o original.
Você usou uma sintaxe específica não
sh
compatívelbash
, então corrigi a linha shebang para corresponder.A coisa toda pode ser feita em formato puro
bash
. O uso de múltiplastr
invocações, externasawk
,bc
é ineficiente. Em particular, você deve saber quebash
até mesmo compatível com POSIXsh
pode fazer contas internamente.
Responder2
Aqui está um script que faz isso de forma limpa (espero). Não estou familiarizado com métodos de impressão/encadernação, então não tenho certeza se o sequenciamento está correto, mas certamente funciona do centro para fora... Eu simplesmente não Não sei a sequência de dobra/corte necessária (além do exemplo de 16 páginas)... Incluí um exemplo de saída de 24 páginas.
pages=${1:-16}
pagesPerSheet=4
sheets=$(( (pages/pagesPerSheet)
+((pages%pagesPerSheet)>0) ))
pagesTot=$((sheets*pagesPerSheet))
Ob=0 # overall begin
Ox=$((pagesTot+1)) # overall max
Hb=$((Ox/2)) # 2nd Half begin
hx=$((Hb+1)) # 1st half max
for ((s=sheets;s>0;s-=2)) ;do
printf '%su,%su,%s,%s,%su,%su,%s,%s%s' \
$((Ob+=1)) $((Ox-=1)) \
$((hx-=1)) $((Hb+=1)) \
$((Ox-=1)) $((Ob+=1)) \
$((Hb+=1)) $((hx-=1)) \
$(((s>2)) && echo ,)
done; echo
saída
# 16 page
1u,16u,8,9,15u,2u,10,7,3u,14u,6,11,13u,4u,12,5
# 24 page
1u,24u,12,13,23u,2u,14,11,3u,22u,10,15,21u,4u,16,9,5u,20u,8,17,19u,6u,18,7
Este trecho de código imprime uma visualização gráfica
Ob=0 # overall begin
Ox=$((pagesTot+1)) # overall max
Hb=$((Ox/2)) # 2nd Half begin
hx=$((Hb+1)) # 1st half max
for ((s=sheets;s>0;s-=2)) ;do
printf '%2su %2su | %2su %2su\n%2s %2s | %2s %2s\n------- -------\n' \
$((Ob+=1)) $((Ox-=1)) $((Ox-=1)) $((Ob+=1)) \
$((hx-=1)) $((Hb+=1)) $((Hb+=1)) $((hx-=1))
done
saída
# 16 page
1u 16u | 15u 2u
8 9 | 10 7
------- -------
3u 14u | 13u 4u
6 11 | 12 5
------- -------
# 24 page
1u 24u | 23u 2u
12 13 | 14 11
------- -------
3u 22u | 21u 4u
10 15 | 16 9
------- -------
5u 20u | 19u 6u
8 17 | 18 7
------- -------
Responder3
Entendo o desejo de derivar uma fórmula, mas não seria muito mais fácil e, portanto, melhor, do ponto de vista da manutenção, usar algo assim:
#!/bin/bash
arr=(1 16 8 9 15 2 10 7 3 14 6 11 13 4 12 5)
for i in {0..3}; do
for n in ${arr[*]}; do
echo -n $((n+16*i))","
done
echo
done | sed -r 's/([^,]+,[^,]+),/\1\n/g'
Ou o padrão não se repete assim:
1,16
8,9
15,2
10,7
3,14
6,11
13,4
12,5
17,32
24,25
31,18
26,23
19,30
22,27
29,20
28,21
...