두 변수 열의 데이터를 동일한 형식으로 표시하려면 어떻게 해야 합니까?

두 변수 열의 데이터를 동일한 형식으로 표시하려면 어떻게 해야 합니까?

열 형식의 데이터를 표시하기 위해 다음 코드를 작성했습니다.

str1='hello i      am robert
and your ma frnd'

str2='thisisaverylongword thisistoohehehe andherefinishthe         string
hereis a other linefortheexample'

IFS=$'\n'
echo '----------------------'
echo 'STRING SHORT'
echo '----------------------'
echo "$str1" | column -t
echo
echo '----------------------'
echo 'STRING LONG'
echo '----------------------'
echo "$str2" | column -t

어떤 출력:

----------------------
STRING SHORT
----------------------
hello  i     am  robert
and    your  ma  frnd

----------------------
STRING LONG
----------------------
thisisaverylongword  thisistoohehehe  andherefinishthe  string
hereis               a                other             linefortheexample

자, 이제 동일한 패턴을 사용하여 문자열의 형식을 지정해 보겠습니다. 단, 문자열을 병합하지는 않습니다.

이것이 내가 찾고 있는 결과입니다:

----------------------
STRING SHORT
----------------------
hello                i                am                robert
and                  your             ma                frnd

----------------------
STRING LONG
----------------------
thisisaverylongword  thisistoohehehe  andherefinishthe  string
hereis               a                other             linefortheexample

그것을 수행하는 방법에 대한 아이디어가 있습니까? 포맷하기 전에 문자열을 병합하고 분할할 수도 있나요?

이것은 단지 예일 뿐이며 이 특정 사례에 대한 것이 아니라 일반적인 해결책을 찾고 있습니다.

답변1

당신은해야

printf "%s\n" "$str1" "$str2" | column -t

그리고그 다음에헤더 삽입

일반적으로 배열을 사용하여 다음과 같이 작성합니다.

strings=( "$str1" "$str2" ... )
headers=( "STRING SHORT" "STRING LONG" ... )

exec 3< <( printf "%s\n" "${strings[@]}" | column -t )
for (( i=0; i<${#strings[@]}; i++)); do
    printf -- "----\n%s\n----\n" "${headers[i]}"
    n=$(wc -l <<< "${strings[i]}")
    for (( j=1; j<=n; j++ )); do
        IFS= read -r line <&3
        echo "$line"
    done
    echo
done
exec 3<&-

노트:

  • <( ... )카니발이에요프로세스 교체. 이는 파일 이름으로 처리되는 일반 파이프입니다. 이는 파이프를 사용할 때 매우 편리하지만 서브쉘에서 파이프의 오른쪽을 실행할 수 없습니다.
  • 여기서는 이 "파일"에서 데이터를 읽기 위해 파일 설명자 #3을 엽니다.exec 3<file
  • read -r line <&3프로세스 교체에서 데이터 행 읽기
  • exec 3<&-파일 설명자 닫기
  • 여기에서 리디렉션에 대해 자세히 알아보세요.http://www.gnu.org/software/bash/manual/bashref.html#Redirections
  • a를 사용할 수도 있었지만 printf ... | while read line; do ...; donefor 루프를 사용하면 계산이 더 쉬워질 것이라고 생각했습니다.

관련 정보