এখানে একটি বাশ স্ক্রিপ্ট আছে। এটি 'কলাম -t` ব্যবহার করে না, এবং বিভাজকটি ঠিক আইএফএসের মতো পরিচালনা করা হয়, কারণ এটি আইএফএস (বা কমপক্ষে, আইএফএসের অভ্যন্তরীণ সংস্করণ) ... ডিফল্ট ডিলিমিটারটি হ'ল' \ t '
এই স্ক্রিপ্টটি পুরোপুরি ডানদিকের ক্ষেত্রটিকে প্যাড করে।
'কলাম' এটি করে না।
সমস্ত কলাম কমানোর মাধ্যমে, এই স্ক্রিপ্টটি
সহজেই একটি টেবিল ফ্রেম তৈরি করতে পরিবর্তন করা যেতে পারে ।
বিঃদ্রঃ. ইনপুট ফাইলটি দু'বার প্রক্রিয়া করা প্রয়োজন
('কলাম' এছাড়াও এটি করতে হবে)
প্রথম পাসটি কলাম সর্বাধিক প্রস্থ পাওয়া।
দ্বিতীয় পাসটি ক্ষেত্রগুলি প্রসারিত করতে হবে (প্রতি কলামে)
কিছু বিকল্প যুক্ত করা হয়েছে এবং একটি সুস্পষ্ট বাগ স্থির করা হয়েছে (পরিবর্তনশীলগুলির নামকরণ :(
- -l যেকোন ইন্ডেন্টেড ক্ষেত্রের বাম ট্রিম হোয়াইটস্পেস
- -আর প্রশস্ত পাঠ্যের চেয়ে ডান ট্রিম সাদা স্থান প্রশস্ত করুন (কলামের জন্য)
- -b উভয় -l এবং -r
- -L বাম আউটপুট ডিলিমিটার যুক্ত করা হয়
- -R ডান আউটপুট ডিলিমিটার যুক্ত করা হয়
- -বি উভয় -L এবং -আর
- -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