it-swarm.com.de

Wie drucke ich mehrzeilige Variablen in nebeneinander angeordneten Spalten (bash)?

Ich habe zwei Variablen, die mehrzeilige Informationen enthalten und ich möchte sie spalten.

varA kehrt zurück

Aug 01
Aug 04
Aug 16
Aug 26

und varB kehrt zurück

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

wenn ich beide Variablen drucke, gibt es zurück

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

Was ich tun möchte, ist das folgende:

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

Ich bin neu in Linux und würde mich über einen Rat freuen, danke.

10
BNairb

Lernen Sie paste kennen, einen Teil der vorinstallierten GNU-Kerndienstprogramme :

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

paste verwendet Dateien und keine Variablen als Eingabe, daher habe ich bash Process Substitution verwendet und den Variableninhalt einfach mit printf gedruckt. Das Standardtrennzeichen zwischen den Spalten ist TAB. Sie können dies mit der Option -d ändern, z. paste -d" " für ein einzelnes Leerzeichen. Weitere Informationen zu paste finden Sie im Online-Handbuch oder führen Sie info '(coreutils) paste invocation' aus.

22
dessert

Wenn Sie nur die Textvariablen nebeneinander anzeigen möchten, hat @dessert die einfachste (beste?) Lösung mit print. Wenn Sie jedoch jedes Stück einzeln manipulieren möchten, können Sie die Vars einfach in Arrays konvertieren und diese durchlaufen.

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

Sie können dies mit dem POSIX-Tool pr tun:

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

Ergebnis:

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

Oder für einzelne Registerkarte:

pr -2 -t -s

Oder für ein einzelnes Leerzeichen:

pr -2 -t -s' '

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

Oder mit column aus dem util-linux -Paket:

column -c 20 <<eof
$varA
$varB
eof
3
Steven Penny

Wenn Sie externe Dienstprogramme vermeiden und dies in der Shell tun möchten, können Sie read mit separaten Dateideskriptoren/here-Zeichenfolgen für jede Variable verwenden:

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

Obwohl die Verwendung der Shell für die Textverarbeitung oft als schlechte Praxis angesehen wird, kann dies für den Fall entschuldigt werden, dass die Daten bereits in Shell-Variablen enthalten sind.

3
steeldriver