trocando campos em colunas por padrão fixo (sim, não, não, sim)

trocando campos em colunas por padrão fixo (sim, não, não, sim)

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

insira a descrição da imagem aqui

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 shcompatível bash, então corrigi a linha shebang para corresponder.

  • A coisa toda pode ser feita em formato puro bash. O uso de múltiplas trinvocações, externas awk, bcé ineficiente. Em particular, você deve saber que bashaté mesmo compatível com POSIX shpode 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

...

informação relacionada