यहाँ एक बैश स्क्रिप्ट है। यह 'कॉलम -t` का उपयोग नहीं करता है, और सेपरेटर को ठीक उसी तरह से नियंत्रित किया जाता है, जैसा कि IFS है, क्योंकि यह IFS (या कम से कम, IFS के awk का आंतरिक संस्करण) है ... डिफ़ॉल्ट सीमांकक $' t 't है
यह स्क्रिप्ट पूरी तरह से सबसे सही फ़ील्ड को निकालती है।
'कॉलम' ऐसा नहीं करता है।
सभी कॉलमों को पैडिंग करके, इस स्क्रिप्ट को
टेबल फ्रेम बनाने के लिए आसानी से संशोधित किया जा सकता है ।
ध्यान दें। इनपुट फ़ाइल को दो बार संसाधित करने की आवश्यकता है
('कॉलम' को भी ऐसा करने की आवश्यकता होगी)
पहला पास कॉलम अधिकतम चौड़ाई प्राप्त करना है।
दूसरा पास फ़ील्ड (प्रति स्तंभ) का विस्तार करने के लिए है
कुछ विकल्प जोड़े और एक चमकता हुआ बग (नामकरण चर :(
- -एल लेफ्ट ट्रिम व्हाट्सएप के किसी भी इंडेंटेड फील्ड
- -r सही ट्रिम व्हाट्सएप व्यापक पाठ की तुलना में व्यापक (स्तंभ के लिए)
- -b दोनों -l और -r
- -L वाम आउटपुट सीमांकक जोड़ा जाता है
- -R सही आउटपुट सीमांकक जोड़ा जाता है
- -बी दोनों -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