বাশে পাশাপাশি থাকা কলামগুলিতে মাল্টলাইন ভেরিয়েবল কীভাবে মুদ্রণ করবেন?


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, প্রাক-প্রতিষ্ঠিত জিএনইউ কোর ইউটিলিটির অংশ :

$ 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
@ নায়রব যদি এই উত্তরটি আপনার সমস্যার সমাধান করে, তবে দয়া করে কিছুক্ষণ সময় নিন এবং বামদিকে চেক চিহ্নটি ক্লিক করে এটি গ্রহণ করুন। এটি প্রশ্নটিকে উত্তর হিসাবে চিহ্নিত করবে এবং স্ট্যাক এক্সচেঞ্জের সাইটগুলিতে ধন্যবাদ প্রকাশ করার উপায়।
মিষ্টি

7

আপনি যদি কেবল টেক্সট ভেরিয়েবল পাশাপাশি পাশাপাশি প্রদর্শন করতে চান তবে @ ডিজিটারের সর্বাধিক সহজ (সেরা?) সমাধান ব্যবহার করে 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

আপনি পসিক্স সরঞ্জাম দিয়ে এটি করতে পারেন 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

যদিও এটি প্রায়শই টেক্সট প্রসেসিংয়ের জন্য শেলটি ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয় তবে শেল ভেরিয়েবলগুলিতে আপনার কাছে ইতিমধ্যে ডেটা রয়েছে এমন ক্ষেত্রে এটি ক্ষমা হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.