複数行の変数を並べて列に出力する方法(bash)?


11

複数行の情報を含む2つの変数があり、それらを列にしたいと思います。

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の初心者です。アドバイスをいただければ幸いです。


2つの変数を印刷する際に使用したbashコードを含めてください。それはあなたがあなたの試みで間違ったことを私たちが見ることができるようにするためです。
Bernard Wei

回答:


22

pasteプリインストールされているGNUコアユーティリティの一部であるMeet :

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

paste変数ではなくファイルを入力として受け取るため、bashProcess Substitutionを使用し、で変数の内容を出力しましたprintf。列間のデフォルトの区切り文字はTABです。-dたとえばpaste -d" "、単一の空白文字の場合、オプションでそれを変更できます。詳細についてpasteは、オンラインマニュアルを参照するか、を実行してくださいinfo '(coreutils) paste invocation'


1
@BNairbこの回答で問題が解決した場合は、しばらくしてから左側のチェックマークをクリックして同意してください。これにより、質問に回答済みのマークが付けられ、Stack Exchangeサイトで感謝の意が表明されます。
デザート

7

テキスト変数を並べて表示するだけの場合は、@ dessertがを使用する最も簡単な(最良の?)解決策になりprintます。ただし、各部分を個別に操作できるようにする場合は、代わりに変数を配列に簡単に変換し、それをループすることができます。

#!/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"

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

多くの場合、テキスト処理にシェルを使用することは悪い習慣であると考えられていますが、シェル変数にデータが既にある場合は、免除される可能性があります。


3

これは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.