bash에서 병렬 열에 여러 줄 변수를 인쇄하는 방법은 무엇입니까?


12

여러 줄 정보를 포함하는 두 개의 변수가 있으며 열을 만들고 싶습니다.

varA 보고

Aug 01
Aug 04
Aug 16
Aug 26

그리고 varB반환

04:25
07:28
03:39
10:06

두 변수를 모두 인쇄하면 반환됩니다.

Aug01
Aug04
Aug16
Aug26
04:25
07:28
03:39
10:06

내가하고 싶은 것은 다음과 같습니다.

Aug01 04:25
Aug04 07:28
Aug16 03:39
Aug26 10:06

저는 Linux를 처음 사용하고 조언을 부탁드립니다.


두 변수를 인쇄 할 때 사용한 bash 코드를 포함 시키십시오. 그것은 당신이 당신의 시도에서 잘못한 것을 볼 수 있도록하기위한 것입니다.
Bernard Wei

답변:


22

paste사전 설치된 GNU 핵심 유틸리티 의 일부인 다음을 만나보십시오 .

$ paste <(printf %s "$varA") <(printf %s "$varB")
Aug 01  04:25
Aug 04  07:28
Aug 16  03:39
Aug 26  10:06

paste변수가 아닌 파일을 입력으로 사용하므로 bash프로세스 대체를 사용 하고 변수 내용을로 인쇄했습니다 printf. 열 사이의 기본 구분 기호입니다 TAB, 당신은 함께 그것을 변경할 수 있습니다 -d옵션, 예를 들어 paste -d" "하나의 공백 문자에 대한. 더에 대한 자세한 내용은 paste상기 모습이 온라인 수동 또는 실행 info '(coreutils) paste invocation'.


1
@BNairb이 답변으로 문제가 해결 되었다면 잠시 후 왼쪽의 확인 표시를 클릭하여 수락하십시오 . 그러면 질문이 답변 된 것으로 표시되며 Stack Exchange 사이트에 감사가 표현되는 방식입니다.
디저트

7

텍스트 변수를 나란히 표시하려면 @dessert가를 사용하는 가장 간단한 (최상의?) 솔루션을 갖습니다 print. 그러나 각 조각을 개별적으로 조작하려면 vars를 배열로 쉽게 변환하고 반복 할 수 있습니다.

#!/bin/bash

# declare the multi-line variables
var1="1
2
3
4"
var2="a
b
c
d"

# backup internal field separator to be safe
IFSave=$IFS

# set IFS to newline so vars will use newline to split into array
IFS=$'\n'

# split variables into array
foo=($var1)
bar=($var2)

#restore IFS to original value to be safe
IFS=$IFSave

# loop array foo, and cross reference key in array bar
for i in "${!foo[@]}"; do 
  printf "${foo[$i]} : ${bar[$i]}\n"
done

# you can allso now print single corresponding lines:
line=3

let id=$line-1 # arrays start at 0, so need to remove one

printf "\nPrinting line number $line\n"
printf "${foo[$id]} : ${bar[$id]}\n"

4

POSIX 도구를 사용하여이 작업을 수행 할 수 있습니다 pr.

varA='Aug 01
Aug 04
Aug 16
Aug 26'
varB='04:25
07:28
03:39
10:06'
pr -2 -t <<eof
$varA
$varB
eof

결과:

Aug 01                              04:25
Aug 04                              07:28
Aug 16                              03:39
Aug 26                              10:06

또는 단일 탭의 경우 :

pr -2 -t -s

또는 단일 공간의 경우 :

pr -2 -t -s' '

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html

또는을 가진 column로부터 util-linux패키지 :

column -c 20 <<eof
$varA
$varB
eof

3

외부 유틸리티를 피하고 셸에서 기본적으로 수행하려면 read각 변수에 대해 별도의 파일 설명자 / here 문자열을 사용할 수 있습니다 .

while IFS= read -r -u3 a && read -r -u4 b; do 
  printf '%s\t%s\n' "$a" "$b"
done 3<<<"$varA" 4<<<"$varB"
Aug 01  04:25
Aug 04  07:28
Aug 16  03:39
Aug 26  10:06

텍스트 처리에 셸을 사용하는 것은 좋지 않은 방법으로 간주되지만 셸 변수에 이미 데이터가있는 경우에는 제외 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.