замена полей в столбцах по фиксированному шаблону (да, нет, нет, да)

замена полей в столбцах по фиксированному шаблону (да, нет, нет, да)

Я хочу создать следующий список страниц (для работы по спуску полос); (количество страниц может быть разным, но я делаю выборку своих потребностей, используя список из 16 страниц, логика та же самая для более длинных списков)

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

Я написал это для цикла:

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 " " ","

что, однако, производит:

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

и не список страниц, которые я хочу. Поэтому мне нужно с помощью awk или других команд поменять поля в некоторых столбцах по этой схеме (повторяя каждые 4 пары страниц)

поменять поля местами

нет полей подкачки

нет полей подкачки

поменять поля местами

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

обобщая логику этого наложения (мне нужно наложить один экземпляр книги формата А6 на страницу формата А4) я написал более обобщенный сценарий

#!/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

Однако я могу произвести только:

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

вместо правильного:

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

что я передаюМультивалентный.jar

Я прилагаю фотографию правильного наложения листа А6 на лист А4, чтобы показать правильную последовательность наложения.

введите описание изображения здесь

то, что я пытаюсь получить, это способ разместить целую книгу формата А6 на странице А4 вОДИНподпись, состоящая из всех ее страниц (не 8-страничного спуска), для того, чтобы разрезать пополам страницу А4, сложить две половины одну над другой, получить обратный лист, разрезать пополам и нанести клей на левый край, чтобы наложить обложку

для выполнения этой задачи мне нужно либо переосмыслить мой скрипт с нуля, либо найти способ поменять местами поля в столбцах по фиксированному шаблону (поменять местами, не менять местами, не менять местами, поменять местами), чтобы исправить неправильный порядок, созданный моим скриптом

РЕДАКТИРОВАТЬ

решена проблема отправки стандартного вывода скрипта в awk с помощью этого синтаксиса:

awk -F "," '{
    print $2 "," $1;
    getline; print;
    getline; print;
    getline; print $2 "," $1
}' 

решение1

Следующий скрипт — гораздо более понятный способ получения желаемого результата.

#!/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

Пример

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

Я переписал ваш сценарий, поскольку в оригинале было несколько проблем.

  • Вы использовали несовместимый shсинтаксис bash, поэтому я исправил строку shebang, чтобы она соответствовала.

  • Все это можно сделать в pure bash. Использование множественных trвызовов, внешнего awkи bcнеэффективно. В частности, вы должны знать, что bashи даже POSIX-совместимый shможет выполнять математику внутри.

решение2

Вот скрипт, который делает это чисто (надеюсь). Я не разбираюсь в методах печати/переплета, поэтому не уверен, что последовательность правильная, но она точно работает от центра к краям... Я просто не знаю, какая последовательность фальцовки/резки вам нужна (кроме вашего примера на 16 страниц)... Я включил пример вывода на 24 страницы.

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  

выход

# 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

Этот фрагмент кода выводит графическое представление

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

выход

# 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
-------   -------

решение3

Я понимаю желание вывести формулу, но не будет ли гораздо проще, а значит и лучше, с точки зрения обслуживания, использовать что-то вроде этого:

#!/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' 

Или же закономерность не повторяется следующим образом:

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

...

Связанный контент