วิธีการพิมพ์ตัวแปรหลายบรรทัดในคอลัมน์แบบเคียงข้างกันในทุบตี?


12

ฉันมีสองตัวแปรซึ่งมีข้อมูลหลายบรรทัดและฉันต้องการคอลัมน์พวกเขา

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 และฉันขอขอบคุณคำแนะนำบางอย่าง


โปรดใส่รหัสทุบตีที่คุณใช้ในการพยายามพิมพ์ตัวแปรสองตัว เพื่อให้เราสามารถเห็นสิ่งที่คุณทำผิดในความพยายามของคุณ
Bernard Wei Wei

คำตอบ:


22

พบ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ใช้เวลาไม่ไฟล์และตัวแปรเป็น input ดังนั้นผมจึงใช้bashกระบวนการชดเชยprintfและเพียงแค่พิมพ์เนื้อหาตัวแปรที่มี ตัวคั่นเริ่มต้นระหว่างคอลัมน์คือTABคุณสามารถเปลี่ยนได้ด้วย-dตัวเลือกเช่นpaste -d" "สำหรับอักขระเว้นวรรคเดียว ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการpasteมีลักษณะที่เป็นคู่มือออนไลน์info '(coreutils) paste invocation'หรือเรียกใช้


1
@BNairb หากคำตอบนี้แก้ไขปัญหาของคุณโปรดสละเวลาสักครู่และยอมรับโดยคลิกที่เครื่องหมายถูกทางด้านซ้าย ที่จะทำเครื่องหมายคำถามว่าตอบแล้วและเป็นวิธีที่แสดงความขอบคุณในเว็บไซต์ Stack Exchange
ของหวาน

7

ถ้าคุณเพียงต้องการที่จะเพียงแค่แสดงด้านตัวแปรข้อความข้าง @dessert มีที่ง่ายที่สุด (ดีที่สุด?) printวิธีการใช้ อย่างไรก็ตามหากคุณต้องการจัดการแต่ละชิ้นแยกกันคุณสามารถแปลง vars เป็นอาร์เรย์แทนได้อย่างง่ายดายและวนซ้ำไปเรื่อย ๆ

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

คุณสามารถทำได้ด้วยเครื่องมือ 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

3

หากคุณต้องการที่จะหลีกเลี่ยงยูทิลิตี้ภายนอกและทำมันในเปลือกคุณสามารถใช้readกับสตริงไฟล์ descriptors / 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

แม้ว่ามักจะถือว่าเป็นแนวปฏิบัติที่ไม่ดีในการใช้เชลล์สำหรับการประมวลผลข้อความ แต่อาจมีข้อยกเว้นในกรณีที่คุณมีข้อมูลในตัวแปรเชลล์อยู่แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.