Bagaimana cara mencetak variabel multiline dalam kolom berdampingan (bash)?


11

Saya punya dua variabel yang berisi informasi multiline dan saya ingin mem-kolomnya.

varA kembali

Aug 01
Aug 04
Aug 16
Aug 26

dan varBkembali

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

jika saya mencetak kedua variabel, itu kembali

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

Yang ingin saya lakukan adalah sebagai berikut:

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

Saya baru di Linux dan saya akan sangat menghargai beberapa saran, terima kasih.


Harap sertakan kode bash yang Anda gunakan dalam upaya Anda untuk mencetak dua variabel. Ini agar kami dapat melihat kesalahan apa yang Anda lakukan dalam upaya Anda.
Bernard Wei

Jawaban:


22

Meet paste, bagian dari utilitas inti GNU yang sudah diinstal :

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

pastemengambil file dan bukan variabel sebagai input, jadi saya menggunakan bashProses Pergantian dan hanya mencetak konten variabel dengan printf. Pembatas default antara kolom adalah TAB, Anda dapat mengubahnya dengan -dopsi, misalnya paste -d" "untuk karakter spasi tunggal. Untuk mempelajari lebih lanjut tentang pastelihat manual online atau jalankan info '(coreutils) paste invocation'.


1
@BNairb Jika jawaban ini menyelesaikan masalah Anda, mohon luangkan waktu dan terima dengan mengklik tanda centang di sebelah kiri. Itu akan menandai pertanyaan sebagai dijawab dan cara terima kasih diungkapkan di situs Stack Exchange.
hidangan penutup

7

Jika Anda hanya ingin hanya menampilkan variabel teks berdampingan, @dessert memiliki solusi paling sederhana (terbaik?) Menggunakan print. Namun jika Anda ingin dapat memanipulasi masing-masing bagian secara terpisah, Anda dapat dengan mudah mengubah vars menjadi array, dan mengulanginya.

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

Jika Anda ingin menghindari utilitas eksternal dan melakukannya secara asli di shell, Anda dapat menggunakan readdengan deskriptor file terpisah / di sini string untuk setiap variabel:

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

Meskipun sering dianggap praktik yang buruk untuk menggunakan shell untuk pemrosesan teks, itu bisa dimaafkan jika Anda sudah memiliki data dalam variabel shell.


3

Anda dapat melakukan ini dengan alat 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

Hasil:

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

Atau untuk satu tab:

pr -2 -t -s

Atau untuk ruang tunggal:

pr -2 -t -s' '

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

Atau dengan columndari util-linuxpaket:

column -c 20 <<eof
$varA
$varB
eof
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.