นี่คือสคริปต์ทุบตี มันไม่ได้ใช้ 'column -t` และ seperator ได้รับการจัดการเหมือนกับ IFS เนื่องจากเป็น IFS (หรืออย่างน้อยที่สุด IFS รุ่นภายใน awk ของ ... ) ตัวคั่นเริ่มต้นคือ $' \ t '
สคริปต์นี้แผ่ออกจากเขตข้อมูลขวาสุดอย่างเต็มที่
'คอลัมน์' ไม่ได้ทำเช่นนี้
ด้วยการขยายคอลัมน์ทั้งหมดสคริปต์นี้สามารถ
แก้ไขได้อย่างง่ายดายเพื่อสร้างกรอบตารางเช่นกัน
บันทึก. ไฟล์อินพุตต้องถูกประมวลผลสองครั้ง
('คอลัมน์' จะต้องทำเช่นนี้)
การผ่านครั้งแรกคือการรับความกว้างสูงสุดของคอลัมน์
รอบที่สองคือการขยายสาขา (ต่อคอลัมน์)
เพิ่มตัวเลือกบางส่วนและแก้ไขข้อบกพร่องที่เห็นได้ชัด (เปลี่ยนชื่อตัวแปร :(
- -l whitespace ตัดแต่งด้านซ้ายของฟิลด์เยื้องใด ๆ
- -r Right whitespace กว้างกว่าข้อความที่กว้างที่สุด (สำหรับคอลัมน์)
- -b ทั้ง -l และ -r
- -L ตัวคั่นเอาต์พุตด้านซ้ายถูกเพิ่ม
- -R ตัวคั่นเอาต์พุตขวาถูกเพิ่ม
- -B ทั้ง -L และ -R
- -S เลือกตัวคั่นเอาต์พุต
#!/bin/bash
#
# script [-F sep] [file]
#
# If file is not specified, stdin is read
#
# ARGS ######################################################################
l=;r=;L=;R=;O=;F=' ' # defaults
for ((i=1;i<=${#@};i++)) ;do
case "$1" in
-- ) shift 1;((i--));break ;;
-l ) l="-l";shift 1;((i-=1)) ;; # left strip whitespace
-r ) r="-r";shift 1;((i-=1)) ;; # right strip whitespace
-b ) l="-l";r="-r";shift 1;((i-=1)) ;; # strip both -l and -r whitespace
-L ) L="-L";shift 1;((i-=1)) ;; # Left output delimiter is added
-R ) R="-R";shift 1;((i-=1)) ;; # Right output delimiter is added
-B ) L="-L";R="-R";shift 1;((i-=1)) ;; # output Both -L and -R delimiters
-F ) F="$2";shift 2;((i-=2)) ;; # source separator
-O ) O="$2";shift 2;((i-=2)) ;; # output separator. Default = 1st char of -F
-* ) echo "ERROR: invalid option: $1" 1>&2; exit 1 ;;
* ) break ;;
esac
done
#
if [[ -z "$1" ]] ;then # no filename, so read stdin
f="$(mktemp)"
ifs="$IFS"; IFS=$'\n'; set -f # Disable pathname expansion (globbing)
while read -r line; do
printf "%s\n" "$line" >>"$f"
done
IFS="$ifs"; set +f # re-enable pathname expansion (globbing)
else
f="$1"
fi
[[ -f "$f" ]] || { echo "ERROR: Input file NOT found:" ;echo "$f" ;exit 2 ; }
[[ -z "$F" ]] && F=' ' # input Field Separator string
[[ -z "$O" ]] && O="$F" # output Field Separator
O="${O:0:1}" # use single char only
# MAIN ######################################################################
max="$( # get max length of each field/column, and output them
awk -vl="$l" -vr="$r" -vL="$L" -vR="$R" -vF="$F" -vO="$O" '
BEGIN { if (F!="") FS=F }
{ for (i=1;i<=NF;i++) {
if (l=="-l") { sub("^[ \t]*","",$i) }
if (r=="-r") { sub("[ \t]*$","",$i) }
len=length($i); if (len>max[i]) { max[i]=len }
if (i>imax) { imax=i }
}
}
END { for(i=1;i<=imax;i++) { printf("%s ",max[i]) } }
' "$f"
)"
awk -vl="$l" -vr="$r" -vL="$L" -vR="$R" -vF="$F" -vO="$O" -v_max="$max" '
BEGIN { if (F!="") FS=F; cols=split(_max,max," ") }
{ # Bring each field up to max len and output with delimiter
printf("%s",L=="-L"?O:"")
for(i=1;i<=cols;i++) { if (l=="-l") { sub("^[ \t]*","",$i) }
if (r=="-r") { sub("[ \t]*$","",$i) }
printf("%s%"(max[i]-length($i))"s%s",$i,"",i==cols?"":O)
}
printf("%s\n",R=="-R"?O:"")
}
' "$f"
# END #######################################################################
if [[ -z "$1" ]] ;then # no filename, so stdin was used
rm "$f" # delete temp file
fi
exit