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

3

Eu quero produzir uma lista de páginas a seguir (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 maiores)

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 eu quero. Então, eu preciso, com o awk ou outros comandos, trocar campos em algumas colunas seguindo esse padrão (repetindo a cada 4 pares de páginas)

campos de troca

sem campos de troca

sem campos de troca

campos de troca

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 desta imposição (eu preciso impor uma única cópia de um livro A6 através de um formato de página A4) Eu escrevi um script 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ó posso produzir:

16u, 1u, 8,9,15u, 2u, 7,10,14u, 3u, 6,11,13u, 4u, 5,12

em vez de direito:

1u, 16u, 8,9,15u, 2u, 10,7,3u, 14u, 6,11,13u, 4u, 12,5

que eu passo para o Multivalent.jar

Anexei uma imagem da imposição correta de um A6 em um A4 para mostrar a seqüência certa de imposição

OqueeutentoobteréumamaneiradeimporumlivroA6inteiroemumapáginaA4emUMAassinaturaqueconsisteemtodasassuaspáginas(nãoaImposiçãode8páginas),paracortarmeiapáginaA4,fecheasduasmetadesumasobreaoutra,invertaafolhaobtida,corte-aaomeioeapliquecolaàbordaesquerdaparaaplicaratampa

paraexecutaressatarefaeuprecisoourepensarmeuscriptdozeroouencontrarumamaneiradetrocarcamposemcolunasporumpadrãofixo(swap,semswap,semswap,swap)paracorrigiraordemincorretaproduzidapelomeuscript

EDITAR

resolvidoenviandosaídapadrãodoscriptparaoawkcomestasintaxe:

awk -F "," '{ print $2 "," $1; getline; print; getline; print; getline; print $2 "," $1 }'     
por Dingo 16.04.2012 / 00:07

3 respostas

3

O script a seguir é uma maneira muito mais clara 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

Eu reescrevi seu script porque havia vários problemas com o original.

  • Você usou a sintaxe específica que não é sh compatible bash , então corrigi a linha shebang para corresponder.

  • A coisa toda pode ser feita em bash puro. O uso de várias invocações tr , um awk externo e bc é ineficiente. Em particular, você deve saber que bash e até sh compatível com POSIX podem fazer matemática internamente.

por 16.04.2012 / 04:12
2

Aqui está um script que faz isso de forma limpa (espero) .. Eu não estou com métodos de impressão / vinculação, então eu não tenho certeza se o seqüenciamento está correto, mas certamente funciona do centro para fora ... Eu simplesmente não conheço a seqüência de dobra / corte que você precisa (além do exemplo de 16 páginas) ... Eu incluí uma amostra 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 snippet 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
-------   -------
    
por 16.04.2012 / 07:31
1

Eu entendo o desejo de derivar uma fórmula, mas não seria muito mais fácil e, portanto, melhor, de uma perspectiva de 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/([^,]+,[^,]+),/\n/g' 

Ou o padrão não é repetido 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

...
    
por 16.04.2012 / 08:08