बैश में साइड-बाय-साइड कॉलम में मल्टीलाइन वेरिएबल्स कैसे प्रिंट करें?


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

मैं लिनक्स का उपयोग करने के लिए नया हूं और मैं कुछ सलाह की सराहना करूंगा।


कृपया दो चर को प्रिंट करने के लिए अपने प्रयास में प्रयुक्त बैश कोड को शामिल करें। यह इतना है कि हम देख सकते हैं कि आपने अपने प्रयास में क्या गलत किया है।
बर्नार्ड वेई

जवाबों:


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फ़ाइलें लेता है और इनपुट के रूप में चर नहीं है, इसलिए मैंने bashप्रक्रिया प्रतिस्थापन का उपयोग किया और बस चर सामग्री को मुद्रित किया printf। स्तंभों के बीच डिफ़ॉल्ट सीमांकक है TAB, आप -dविकल्प के साथ बदल सकते हैं , उदाहरण के paste -d" "लिए एकल स्थान वर्ण के लिए। ऑनलाइन मैनुअल या रन pasteको देखने के बारे में अधिक जानने के लिए ।info '(coreutils) paste invocation'


1
@BNairb यदि इस उत्तर से आपकी समस्या हल हो गई है, तो कृपया एक क्षण लें और इसे बाईं ओर चेक मार्क पर क्लिक करके स्वीकार करें। यह प्रश्न के उत्तर के रूप में चिह्नित करेगा और स्टैक एक्सचेंज साइटों पर धन्यवाद व्यक्त करने का तरीका है।
मिठाई

7

यदि आप केवल पाठ चर को साथ-साथ दिखाना चाहते हैं, तो @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"

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अलग-अलग फ़ाइल डिस्क्रिप्टर के साथ उपयोग कर सकते हैं / यहां प्रत्येक चर के लिए तार:

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

हालाँकि इसे अक्सर टेक्स्ट प्रोसेसिंग के लिए शेल का उपयोग करने के लिए बुरा अभ्यास माना जाता है, लेकिन इस मामले में यह बहाना हो सकता है कि आपके पास शेल वेरिएबल्स में पहले से ही डेटा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.