열 형식의 데이터를 표시하기 위해 다음 코드를 작성했습니다.
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 ...; done
for 루프를 사용하면 계산이 더 쉬워질 것이라고 생각했습니다.