Çok satırlı değişkenleri bash'de yan yana sütunlara nasıl yazdırabilirim?


12

Çok satırlı bilgiler içeren iki değişkenim var ve bunları sütunlamak istiyorum.

varA İadeler

Aug 01
Aug 04
Aug 16
Aug 26

ve varBgeri dönüyor

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

her iki değişkeni de yazdırırsam,

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

Ne yapmak istiyorum:

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

Linux kullanımında yeniyim ve bazı tavsiyelerde bulunmaktan memnuniyet duyarım.


Lütfen iki değişkeni yazdırmak için kullandığınız bash kodunu ekleyin. Böylece, yaptığınız girişimde neyi yanlış yaptığınızı görebiliriz.
Bernard Wei

Yanıtlar:


22

pasteÖnceden kurulu GNU çekirdek yardımcı programlarının bir parçası olan Meet :

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

pastedeğişken olarak girdi değil dosya alır, bu yüzden bashİşlem Değiştirme'yi kullandım ve sadece değişken içeriği ile yazdırdım printf. Sütunlar arasındaki varsayılan sınırlayıcı TAB, bunu -dörneğin paste -d" "tek boşluk karakteri için seçenekle değiştirebilirsiniz . Hakkında daha fazla bilgi edinmek pasteiçin çevrimiçi kılavuza bakın veya çalıştırın info '(coreutils) paste invocation'.


1
@BNairb Bu yanıt sorununuzu çözdüyse, lütfen bir dakikanızı ayırın ve soldaki onay işaretini tıklayarak kabul edin. Bu, soruyu yanıtlandığı gibi işaretler ve Stack Exchange sitelerinde teşekkürlerin ifade edilme şeklidir.
tatlı

7

Sadece metin değişkenlerini yan yana görüntülemek istiyorsanız, @ tatlı en basit (en iyi?) Çözümü kullanır print. Ancak, her bir parçayı ayrı ayrı manipüle etmek istiyorsanız, değişkenleri kolayca dizilere dönüştürebilir ve bu döngüye girebilirsiniz.

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

Bunu POSIX aracıyla yapabilirsiniz 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

Sonuç:

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

Veya tek sekme için:

pr -2 -t -s

Veya tek bir alan için:

pr -2 -t -s' '

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

Veya ile columngelen util-linuxpaketin:

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

3

Harici yardımcı programlardan kaçınmak ve yerel olarak kabukta yapmak istiyorsanız, readher değişken için ayrı dosya tanımlayıcıları / burada dizeleriyle kullanabilirsiniz :

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

Kabuğu metin işlemek için kullanmak genellikle kötü uygulama olarak görülse de, kabuk değişkenlerinde zaten veri olması durumunda bu durum mazur görülebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.