2ページ両面印刷用のページ番号リストの作成:2,3,...と1,4,...

2ページ両面印刷用のページ番号リストの作成:2,3,...と1,4,...

次のデルタをどのように生成できますか?

2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,...,135

そして

4,5,8,9,12,13,16,17,20,21,24,25,28,29,32,33,36,37,40,41,44,45,48,49,...,137

ページを印刷するときに必要です。 Bashで増分計算「oneliners」を作成できますが、作成することはできません。誰でも私を助けることができますか?

答え1

何をしたいのかわかりませんが、そのシーケンスを計算することは非常に簡単です。

i=2 # or 4
while true; do
    echo $i
    i=$(($i+1))
    echo $i
    i=$(($i+3))
done

答え2

これはうまくいきます。 2から増やすか、4から増やすように保存してincrement.bash入力します。定義されていない場合は2から始まります。 (以前の実際の作業よりも一部改善されました)bash increment.bash 2bash increment.bash 4

#!/bin/bash

if [ $1 ]; then
    opt=$1
    if [ $opt == "--help" ]; then echo "Usage: $0 [2|4] -- either starting number 2 or 4, to print first number and +1, increment by 3, then continue."; exit 0
    elif [ $opt == 2 ]; then i=$opt
    elif [ $opt == 4 ]; then i=$opt
    fi
else i=2
fi

echo $i; let i++; echo $i;

for (( n=1; $n < 35; n++ )); do
    if [ $i == 135 ] || [ $i == 137 ]; then break; fi
    i=$[i+3]; echo "$i";
    let i++; echo "$i";
done

これが実際に動作するものです:

$ for i in {2..4..2}; do for type in head tail; do echo ":: $i | $type :: "; bash increment.bash $i | $type; done; done
:: 2 | head :: 
2
3
6
7
10
11
14
15
18
19
:: 2 | tail :: 
118
119
122
123
126
127
130
131
134
135
:: 4 | head :: 
4
5
8
9
12
13
16
17
20
21
:: 4 | tail :: 
120
121
124
125
128
129
132
133
136
137

答え3

使用GNU sed~のためスタート~ステップコメント。

printf "%s\n" {1..137} |tee \
    >(sed -nr '2~4H; 3~4H; ${g; s/\n/,/g; s/^,(.*)/\1/p}'>set23) |
      sed -nr '4~4H; 5~4H; ${g; s/\n/,/g; s/^,(.*)/\1/p}'>set45
cat set23
cat set45

出力

2,3,6,7,10,11,14,15, ... ,130,131,134,135
4,5,8,9,12,13,16,17, ... ,132,133,136,137 

答え4

以下は、これらの数字のリストを作成する1つの方法です。 1からの数字を繰り返し、$nその数字を適切なリストに追加します。以下のコードスニペットは移植可能な構文のみを使用します。

recto= verso= i=1
while [ $i -le $n ]; do
  if [ $((i % 4)) -le 1 ]; then recto=$recto,$i; else verso=$verso,$i; done
  i=$((i + 1))
done
recto=${recto%,} verso=${verso%,}

これは ksh/bash/zsh バージョンです:

recto= verso=
for ((i=1; i<n; i++)); do
  if ((i % 4 <= 1)); then recto=$recto,$i; else verso=$verso,$i; done
done
recto=${recto%,} verso=${verso%,}

関連情報