固定パターンで列のフィールドを交換する(はい、いいえ、いいえ、はい)

固定パターンで列のフィールドを交換する(はい、いいえ、いいえ、はい)

(インポジション作業のため)次のページリストを作成したいと思います。 (ページ数は可変ですが、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

この課金のロジックを要約するために(A4ページ形式にA6本の単一コピーを課す必要がある)、より一般的なスクリプトを作成しました。

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

しかし、私が生産できるのは次のとおりです。

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

正しいものの代わりに:

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

私は次に進む複数価格の瓶

正確な組版の順序を示すために、A4を横切ってA6を正確に組版した写真を添付し​​ました。

ここに画像の説明を入力してください。

私が得ようとしているのは、A6本全体をA4ページに強制する方法です。一つすべてのページの署名が含まれています(8ページの正規版ではありません)。 A4ページの半分をカットし、2つの半分を集めて得られた用紙を裏返し、半分にカットし、左端に接着剤を塗ってカバーを適用します。

これを行うには、スクリプトを最初からやり直すか、固定パターン(スワップ、スワップなし、スワップなし、スワップ)を介して列のフィールドをスワップして、スクリプトによって生成された誤った順序を修正する方法を見つける必要があります。

編集する

次の構文を使用して、スクリプトの標準出力を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行を修正しました。

  • すべては純粋に行うことができますbash。複数のtr通貨を使用することは外部通話awkとはbc非効率的です。特に、bashPOSIX互換製品であってもsh内部的に数学演算を実行できることに注意してください。

おすすめ記事