複数行の情報を含む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が初めてなので、アドバイスをいただければ幸いです。
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
Process Substitution を使用し、変数内容をprintf
で出力しました。列間のデフォルトの区切り文字はTAB
であり、-d
オプションを使用して変更できます。 paste -d" "
は、単一のスペース文字です。 paste
の詳細については、 オンラインマニュアル を参照するか、info '(coreutils) paste invocation'
を実行してください。
単にテキスト変数を並べて表示するだけの場合、@ 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"
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
または、util-linux
パッケージのcolumn
で:
column -c 20 <<eof
$varA
$varB
eof
外部ユーティリティを避けてシェルでネイティブに実行する場合は、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
テキスト処理にシェルを使用することはしばしば悪い習慣と考えられていますが、すでにシェル変数にデータがある場合は言い訳されるかもしれません。