シェル芸とかで遊んでいると、よく以下のような数字でできた四角形を生成することがある。

blacknon@BS-PUB-UBUNTU-01:~$ echo {01..16} | xargs -n4
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16

で、この時の数字の順番を斜め順、ジグザグ順でできないかと思ったのでやってみることにした。 一応できたはできたけど、エライ汚い…。

斜め順の場合

echo x{,,,}|fmt -1|awk '{a=a$0;printf("%4s\n",a)}'|tee >(tac|rev)|uniq|sed 's/\B/,/g;s/^,/ ,/g'|sed -z -e's/x/'{01..16}'/'|rs -T -s','|perl -pe 's/ +/ /g;s/^ //g'|tac
blacknon@BS-PUB-UBUNTU-01:~$ echo x{,,,}|fmt -1|awk '{a=a$0;printf("%4s\n",a)}'|tee >(tac|rev)|uniq|sed 's/\B/,/g;s/^,/ ,/g'|sed -z -e's/x/'{01..16}'/'|rs -T -s','|perl -pe 's/ +/ /g;s/^ //g'|tac
01 03 06 10
02 05 09 13
04 08 12 15
07 11 14 16

ジグザグ順の場合

echo x{,,,}|fmt -1|awk '{a=a$0;printf("%4s\n",a)}'|tee >(tac|rev)|uniq|sed 's/\B/,/g;s/^,/,/g'|sed -z -e's/x/'{01..16}'/' -e's/ //g'|awk 'BEGIN{FS=","}NR%02==0{for(i=NF;i>0;i--){if($i==""){a=a","$i}else{b=b","$i}};if($1==""){gsub("^,","",a);print a,b}else{gsub("^,","",b);print b,a};a=b=""}NR%02==1{print $0}'|awk 'BEGIN{FS=OFS=","}{for(i=0;i<NF;i++){if($i==""){$i=" "}}print $0}'|rs -T -s,|sed -r 's/ +/ /g;s/^ //g'|tac
blacknon@BS-PUB-UBUNTU-01:~$ echo x{,,,}|fmt -1|awk '{a=a$0;printf("%4s\n",a)}'|tee >(tac|rev)|uniq|sed 's/\B/,/g;s/^,/,/g'|sed -z -e's/x/'{01..16}'/' -e's/ //g'|awk 'BEGIN{FS=","}NR%02==0{for(i=NF;i>0;i--){if($i==""){a=a","$i}else{b=b","$i}};if($1==""){gsub("^,","",a);print a,b}else{gsub("^,","",b);print b,a};a=b=""}NR%02==1{print $0}'|awk 'BEGIN{FS=OFS=","}{for(i=0;i<NF;i++){if($i==""){$i=" "}}print $0}'|rs -T -s,|sed -r 's/ +/ /g;s/^ //g'|tac
01 02 06 07
03 05 08 13
04 09 12 14
10 11 15 16

もうちょっときれいな書き方がありそうなもんだけど、とりあえずこんな感じで出力ができる。