bash: ประยุกต์ทำบัตรเลขที่ลำดับ

มีโจทย์คือ ให้สร้างบัตรแบบเรียงเลขที่ ตั้งแต่ ๑ จนถึง ๕๐๐
ตัดสินใจใช้ bash + inkscape เพราะง่ายดี
โดยสมมุติว่าเราได้สร้างเอกสารเป็นไฟล์ inkscape ไว้แล้ว โดยให้ตัวเลขที่จะเรียงให้มีค่าเป็น XXXX เพื่อให้สะดวกในการใช้คำสั่ง grep

โค๊ดที่สร้างขึ้น ทำแบบง่าย ๆ คือรันตัวเลขตั้งแต่ 1-500 แต่รุ่นนี้เป็นรุ่นทดสอบ ทำแค่ 1-10 พอ ขั้นตอนคือ

  • แปลงตัวเลขเป็นเลขไทย ด้วยคำสั่ง awk
  • นำไปแทนที่ในไฟล์ inkscape แล้วทำออกมาเป็นไฟล์ใหม่ ด้วยคำสั่ง sed
  • แล้วสั่งส่งออกมาเป็นไฟล์นามสกุล png ด้วยคำสั่งแบบบรรทัดคำสั่งของ inkscape เอง ด้วยพารามิเตอร์ -e

โค๊ดมีดังนี้

$ vi runcard
#!/bin/bash

FILE='card.svg'
QUAN=10
MARKER='XXXX'

for i in $(seq 1 $QUAN); do
    TNUM=`echo $i | awk '{\
 gsub ("0","๐");\
 gsub ("1","๑");\
 gsub ("2","๒");\
 gsub ("3","๓");\
 gsub ("4","๔");\
 gsub ("5","๕");\
 gsub ("6","๖");\
 gsub ("7","๗");\
 gsub ("8","๘");\
 gsub ("9","๙");\
 print }'`
    sed -e "s/$MARKER/$TNUM/g" $FILE > tmp.svg
    inkscape -e tmp$i.png tmp.svg
done
$ chmod 755 runcard

เวลาใช้งานก็สั่งรันชื่อไฟล์ runcard เฉย ๆ จะได้ไฟล์ tmp1.png จนถึง tmp10.png ก็สามารถนำไฟล์เหล่านี้ไปพิมพ์งานได้ตามต้องการ

หมายเหตุ
ไม่แน่ใจว่า การใช้คำสั่ง awk ตามตัวอย่าง จะสามารถเขียนได้กระชับกว่านี้หรือไม่ รบกวนผู้รู้ช่วยแนะนำด้วยครับ

Re: bash: ประยุกต์ทำบัตรเลขที่ลำดับ

น่าจะแทนสคริปต์ awk ได้ด้วย tr นะครับ

เดิมผมคิดถึงคำสั่งแบบนี้:

$ echo 2551 | tr '0-9' '๐-๙'
????

ดูเหมือน tr มันทำงานแบบ 8 บิตเท่านั้น ซึ่งถ้าเป็นโลแคล TIS-620 จะทำงานได้

แต่ถ้าใช้โลแคล UTF-8 ก็บิดนิดหน่อย:

$ echo 2551 | tr '0-9' '\360-\371' | iconv -f TIS-620 -t UTF-8
๒๕๕๑

Re: bash: ประยุกต์ทำบัตรเลขที่ลำดับ

ขอบคุณครับ
ผมหาตั้งนาน ว่าใช้คำสั่ง tr กับ UTF-8 ยังไง :P

Re: bash: ประยุกต์ทำบัตรเลขที่ลำดับ

แจ่ม

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre> <blockquote> <img> <h3> <h4> <h5>
  • Lines and paragraphs break automatically.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.