다음은 bash 스크립트입니다. 'column -t`를 사용하지 않으며, 구분 기호는 IFS (또는 적어도 awk의 내부 버전 IFS)이므로 IFS와 동일하게 처리됩니다. 기본 구분 기호는 $'\ t '입니다.
이 스크립트는 가장 오른쪽 필드를 완전히 채 웁니다.
'열'은 이것을하지 않습니다.
모든 열을 채우면이 스크립트를
쉽게 수정하여 테이블 프레임도 만들 수 있습니다 .
노트. 입력 파일은 두 번 처리해야합니다
( '열'도이 작업을 수행해야 함)
첫 번째 단계는 열 최대 너비를 얻는 것입니다.
두 번째 단계는 필드를 확장하는 것입니다 (열당)
몇 가지 옵션을 추가 하고 눈부신 버그 수정 (이름 바꾸기 변수 :(
- -l 들여 쓰기 된 필드의 왼쪽 트림 공백
- -r 가장 넓은 텍스트보다 넓은 공백을 오른쪽으로 자릅니다 (열의 경우)
- -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