সারিগুলিকে কলামে রূপান্তর করুন


10

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

Virtual Machine : OL6U5
        ID     : 0004fb00000600003da8ce6948c441bb
        Status : Running
        Memory : 65536
        Uptime : 17835 Minutes
        Server : MyOVS1.vmorld.com
        Pool   : HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6
Virtual Machine : OL6U6
        ID     : 0004fb00000600003da8ce6948c441bc
        Status : Running
        Memory : 65536
        Uptime : 17565 Minutes
        Server : MyOVS2.vmorld.com
        Pool   : NON-HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6
Virtual Machine : OL6U7
        ID     : 0004fb00000600003da8ce6948c441bd
        Status : Running
        Memory : 65536
        Uptime : 17835 Minutes
        Server : MyOVS1.vmorld.com
        Pool   : HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6

এই আউটপুটটি হাইপারভাইজারের থেকে হাইপারভাইজারের থেকে আলাদা কারণ কিছু হাইপারভাইজারের উপর আমাদের 50 + ভিএমএস চলছে। উপরের ফাইলটি হাইপারভাইজারের একটি উদাহরণ যেখানে আমাদের কেবল ৩ টি ভিএম চলছে এবং তাই পুনঃনির্দেশিত ফাইলে বেশ কয়েকটি (ভিএম এর সংখ্যা) সম্পর্কিত তথ্য থাকতে পারে বলে আশা করা হচ্ছে

আমাদের কাছে বিশদ / সেড ব্যবহার করে বা শেল স্ক্রিপ্টের সাহায্যে নীচের ফর্ম্যাটে এই বিবরণগুলি পাওয়া দরকার

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool        HA     VCPU  Type     OS
OL6U5            0004fb00000600003da8ce6948c441bb  Running  65536   17835   MyOVS1.vmworld.com  HA-POOL     false  16    Xen PVM  Oracle Linux 6
OL6U6            0004fb00000600003da8ce6948c441bc  Running  65536   17565   MyOVS2.vmworld.com  NON-HA-POOL     false  16    Xen PVM  Oracle Linux 6
OL6U5            0004fb00000600003da8ce6948c441bd  Running  65536   17835   MyOVS1.vmworld.com  HA-POOL     false  16    Xen PVM  Oracle Linux 6

উত্তর:


1

যদি ফাইলটি দুবার হাঁটাচলা করা (বড়) সমস্যা না হয় (কেবলমাত্র একটি লাইন স্মৃতিতে সঞ্চয় করবে):

awk -F : '{printf("%s\t ", $1)}' infile
echo
awk -F : '{printf("%s\t ", $2)}' infile

কোনটি, ক্ষেত্রগুলির একটি সাধারণ গণনার জন্য (যা ফাইলের অনেকগুলি পদচারণা থাকতে পারে):

#!/bin/bash
rowcount=2
for (( i=1; i<=rowcount; i++ )); do
    awk -v i="$i" -F : '{printf("%s\t ", $i)}' infile
    echo
done

তবে সত্যিই সাধারণ ট্রান্সপোজ করার জন্য এটি কাজ করবে:

awk '$0!~/^$/{    i++;
                  split($0,arr,":");
                  for (j in arr) {
                      out[i,j]=arr[j];
                      if (maxr<j){ maxr=j} # max number of output rows.
                  }
            }
    END {
        maxc=i                             # max number of output columns.
        for     (j=1; j<=maxr; j++) {
            for (i=1; i<=maxc; i++) {
                printf( "%s\t", out[i,j])  # out field separator.
            }
            printf( "%s\n","" )
        }
    }' infile

এবং এটি সুন্দর করার জন্য ( \tফিল্ড বিভাজক হিসাবে ট্যাব ব্যবহার করে ):

./script | |column -t -s $'\t'

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6

সাধারণ ট্রান্সপোজের জন্য উপরের কোডটি পুরো ম্যাট্রিক্সকে মেমরিতে সঞ্চয় করবে।
এটি সত্যিই বড় ফাইলগুলির জন্য সমস্যা হতে পারে।


নতুন পাঠ্যের জন্য আপডেট।

প্রশ্নটিতে পোস্ট করা নতুন পাঠ্য প্রক্রিয়া করার জন্য, আমার কাছে মনে হয় দুটি উত্তম উত্তম উত্তর। একটি পাস, ক্ষেত্রের উপস্থিতি হিসাবে সংক্ষিপ্ত, শিরোনাম ক্ষেত্র শিরোনাম মুদ্রণ করবে। পরবর্তী বার্তা পাসটি কেবল ফিল্ড 2 মুদ্রণ করবে will উভয় ক্ষেত্রেই আমি নেতৃস্থানীয় এবং পিছনের স্থানগুলি (আরও ভাল ফর্ম্যাটের জন্য) অপসারণের একটি উপায় যুক্ত করেছি।

#!/bin/bash
{
awk -F: 'BEGIN{ sl="Virtual Machine"}
         $1~sl && head == 1 { head=0; exit 0}
         $1~sl && head == 0 { head=1; }
         head == 1 {
             gsub(/^[ \t]+/,"",$1);   # remove leading  spaces
             gsub(/[ \t]+$/,"",$1);   # remove trailing spaces
             printf( "%s\t", $1)
         }
         ' infile
#echo
awk -F: 'BEGIN { sl="Virtual Machine"}
         $1~sl { printf( "%s\n", "") }
         {
             gsub(/^[ \t]+/,"",$2);   # remove leading  spaces
             gsub(/[ \t]+$/,"",$2);   # remove trailing spaces
             printf( "%s\t", $2)
         }
         ' infile
echo
} | column -t -s "$(printf '%b' '\t')"

পার্শ্ববর্তী { ... } | column -t -s "$(printf '%b' '\t')"হ'ল পুরো টেবিলটিকে সুন্দর উপায়ে ফর্ম্যাট করা।
দয়া করে মনে রাখবেন যে ksh, বাশ বা zsh এ "$(printf '%b' '\t')"প্রতিস্থাপন করা যেতে পারে $'\t'


8

আপনার যদি rs(পুনর্নির্মাণ) ইউটিলিটি উপলব্ধ থাকে তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

rs -Tzc: < input.txt

এটি আউটপুট ফর্ম্যাটটিকে ঠিক যেমন ডাইনামিক কলাম প্রস্থে, প্রশ্নে উল্লিখিত হিসাবে দেয়।

  • -T ইনপুট ডেটা স্থানান্তর করে
  • -z প্রতিটি কলামে সর্বাধিক থেকে কলামগুলি যথাযথ আকার দেয়
  • -c: ইনপুট ফিল্ড বিভাজক হিসাবে কোলন ব্যবহার করে

এটি নির্বিচারে আকারের টেবিলগুলির জন্য কাজ করে, যেমন:

$ echo "Name:Alice:Bob:Carol
Age:12:34:56
Eyecolour:Brown:Black:Blue" | rs -Tzc: 
Name   Age  Eyecolour
Alice  12   Brown
Bob    34   Black
Carol  56   Blue
$ 

rsওএস এক্সে ডিফল্টরূপে উপলব্ধ (এবং সম্ভবত অন্যান্য বিএসডি মেশিনগুলি)। এটি উবুন্টুতে (এবং ডেবিয়ান পরিবারে) এর সাথে ইনস্টল করা যেতে পারে:

sudo apt-get install rs

6

সম্পাদনা: সরল ওয়ান-লাইনারে forলুপে যে কোনও আউটপুট সারিগুলির জন্য বর্ধমান:

for ((i=1;i<=2;i++)); do cut -d: -f "$i" input | paste -sd: ; done | column -t -s:

আসল উত্তর:

bashপ্রক্রিয়া প্রতিস্থাপন ব্যবহার করে আপনি এটি ওয়ান-লাইনার হিসাবে করতে পারেন :

paste -sd: <(cut -d: -f1 input) <(cut -d: -f2 input) | column -t -s:

-sবিকল্পে pasteকরে তোলে একটি সময়ে প্রতিটি ফাইল এক হ্যান্ডেল। :মধ্যে বিভেদক সেট pasteকরে "ধরা" হয় -sকরার অপশন columnক্ষেত্র তৈরি করে শেষে প্রশংসনীয় আপ ফর্ম্যাটে, লাইন আপ।

cutদুই প্রক্রিয়া বদল কমান্ড আউট প্রথম ক্ষেত্র এবং দ্বিতীয় ক্ষেত্র, যথাক্রমে টান।

ইনপুটটিতে ফাঁকা রেখাগুলি থাকুক বা না থাকুক না কেন, column -t -s:নির্বিশেষে আউটপুট পরিষ্কার করবে। (প্রশ্নটিতে উল্লিখিত মূল ইনপুটটিতে ফাঁকা রেখা ছিল, তবে সেগুলি সরিয়ে ফেলা হয়েছে The উপরের কমান্ডটি ফাঁকা লাইন নির্বিশেষে কাজ করে))

ইনপুট - উপরের কমান্ডে "ইনপুট" নামের ফাইলের বিষয়বস্তু:

Virtual_Machine:OL6U7

ID:0004fb00000600003da8ce6948c441bd

Status:Running

Memory:65536

Uptime:17103

Server:MyOVS1.vmworld.com

Pool:HA-POOL

HA:false

VCPU:16

Type:Xen PVM

OS:Oracle Linux 6

আউটপুট:

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6

2
এটি দুটি আউটপুট সারিগুলির জন্য কাজ করে, তবে আরও সারিগুলির জন্য এটি অনর্থক হয়ে যায়।

2

ডাব্লুক ব্যবহার করে, কীটি এবং মানটি সঞ্চয় করুন এবং শেষ পর্যন্ত এগুলি মুদ্রণ করুন।

#!/usr/bin/awk -f
BEGIN {
  CNT=0
  FS=":"
}

{
  HDR[CNT]=$1;
  ENTRY[CNT]=$2;
  CNT++;
}

END {
  for (x = 0; x < CNT; x++)
    printf "%s\t",HDR[x]

  print""

  for (x = 0; x < CNT; x++)
    printf "%s\t",ENTRY[x]
  }

খালি রান awk -f ./script.awk ./input.txt


গতিশীল হতে উত্তর পরিবর্তন। কেবলমাত্র ফাইলটিতে প্রতি 1 ভিএম মূল্যমানের ডেটা দরকার।
jecxjo

1
declare -a COLS
declare -a DATA
while IFS=':' read -ra fields; do
   COLS+=("${fields[0]}")
   DATA+=("${fields[1]}")
done < <( cat /path/to/input.txt)

HEADER=""
DATA=""
for i in $(seq 0 $((${#fields[@]}-1)); do
    HEADER="${HEADER}${COLS[$i]} "
    DATA="${DATA}${COLS[$i]} "
done
echo $HEADER
echo $DATA

1

সাথে gnu datamashএবং columnথেকে util-linux:

datamash -t: transpose <infile | column -t -s:

এটি দুটিরও বেশি কলামের সাথে কাজ করে তবে ধরে নেয় আপনার ইনপুট ফাইলে কোনও খালি লাইন নেই; এর মধ্যে খালি লাইনগুলির সাথে (আপনার প্রাথমিক ইনপুট নমুনার মতো) আপনি একটি ত্রুটি পাবেন:

datamash: transpose input error: line 2 has 0 fields (previous lines had 2);

যাতে এড়াতে আপনার সাথে প্রক্রিয়া করার আগে এগুলি গ্রাস করতে হবে datamash:

tr -s \\n <infile | datamash -t: transpose | column -t -s:

অন্যথায়, এই নির্দিষ্ট ক্ষেত্রে (কেবলমাত্র দুটি কলাম), সহ zshএবং একই column:

list=(${(f)"$(<infile)"})
printf %s\\n ${(j;:;)list[@]%:*} ${(j;:;)list[@]#*:} | column -t -s:

(${(f)"$(<infile)"})একটি অ্যারে লাইন পড়ে; প্রতিটি উপাদানের প্রথম ক্ষেত্রের ${(j;:;)list[@]%:*}সাথে যোগ দেয় (সাথে :) এবং প্রতিটি উপাদানের দ্বিতীয় ক্ষেত্রের ${(j;:;)list[@]#*:}সাথে যোগ দেয় (আবার :); এগুলি উভয়ই মুদ্রিত, যেমন আউটপুট

Virtual_Machine:ID:Status:Memory:Uptime:Server:Pool:HA:VCPU:Type:OS
OL6U7:0004fb00000600003da8ce6948c441bd:Running:65536:17103:MyOVS1.vmworld.com:HA-POOL:false:16:Xen PVM:Oracle Linux 6

যা পরে পাইপ করা হয় column -t -s:


0

cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t

ভার্চুয়াল মেশিনে প্রতি রেখার সংখ্যা এই ক্ষেত্রে হার্ডকোডযুক্ত - ১১. এটি আগে থেকে এটি ভালভাবে গণনা করা যাবে এবং ভেরিয়েবলটিতে সংরক্ষণ করা হবে, তারপরে কোডটিতে এই ভেরিয়েবলটি ব্যবহার করুন।

ব্যাখ্যা

  1. cat <(command 1) <(command 2)- <()নির্মাণ commandএকটি অস্থায়ী ফাইলের মতো আউটপুট প্রদর্শিত করে। অতএব, catদুটি ফাইলকে সম্মতি জানায় এবং এটিকে আরও পাইপ দেয়।

    • কমান্ড 1 : head -n 11 virtual.txt | cut -d: -f1আমাদের ভবিষ্যৎ কলাম হেডার দেয়। একটি ভার্চুয়াল মেশিন এন্ট্রি প্রথম এগারটি লাইন, এটি headপেতে কমান্ডটি ব্যবহৃত হয়। cutদুটি কলাম এই এন্ট্রি splits এবং শুধুমাত্র প্রথম এক মুদ্রণ করুন।
    • কমান্ড 2 : sed 's/.*: //' virtual.txt- আমাদের ভবিষ্যতের কলাম মান দেয়। sedসমস্ত অপ্রয়োজনীয় পাঠ্য সরিয়ে দেয় এবং কেবলমাত্র মান ছেড়ে দেয়।
  2. xargs -d '\n' -n 11। প্রতিটি ইনপুট আইটেম নিউলাইন দ্বারা সমাপ্ত করা হয়। এই কমান্ডটি আইটেমগুলি পায় এবং প্রতি লাইনে 11 দ্বারা মুদ্রণ করে।

  3. column -t- প্রিন্টিং-প্রিন্টিং ডিসপ্লেগুলির জন্য প্রয়োজন। এটি একটি টেবিল আকারে আমাদের লাইনগুলি প্রদর্শন করে। অন্যথায়, প্রতিটি লাইন বিভিন্ন প্রস্থ হবে।

আউটপুট

Virtual  Machine                           ID       Status  Memory  Uptime   Server             Pool         HA     Mode  VCPU  Type  OS
OL6U5    0004fb00000600003da8ce6948c441bb  Running  65536   17835   Minutes  MyOVS1.vmorld.com  HA-POOL      false  16    Xen   PVM   Oracle  Linux  6
OL6U6    0004fb00000600003da8ce6948c441bc  Running  65536   17565   Minutes  MyOVS2.vmorld.com  NON-HA-POOL  false  16    Xen   PVM   Oracle  Linux  6
OL6U7    0004fb00000600003da8ce6948c441bd  Running  65536   17835   Minutes  MyOVS1.vmorld.com  HA-POOL      false  16    Xen   PVM   Oracle  Linux  6

0

একটি ফাইলটিতে সারি এবং কলামগুলি অদলবদল করতে datamashতার transposeবিকল্পটি ব্যবহার করুন।

datamash -t: transpose < infile.txt

ডিফল্টরূপে, ট্রান্সপোজ যাচাই করে তোলে প্রতিটি লাইনে ইনপুটটির একই সংখ্যক ক্ষেত্র রয়েছে এবং অন্যথায় কোনও ত্রুটি ব্যর্থ হয় এবং এর দ্বারা অনুপস্থিত মানগুলিকে অনুমতি দেওয়ার জন্য আপনি এর কঠোর মোডটি অক্ষম করতে পারেন can --no-strict

datamash -t: --no-strict transpose < infile.txt

এছাড়াও আপনি --fillerঅনুপস্থিত-ফিল্ড ফিলার মান সেট করতে ব্যবহার করতে পারেন :

datamash -t: --no-strict --filler " " transpose < infile.txt

থেকে প্রাপ্ত datamash manual


-5

যদি আপনার ডেটা ডিরেক্টরিতে পৃথক ফাইল থাকে তবে আপনি ব্যবহার করতে পারেন:

for file in $(ls $DIRECTORY)
do
  cat ${file} | while read line
  do
    value=$(echo $line | cut -d: -f2-)
    printf "%s\t" "${value}" >> bigfile
  done
  echo " " >> bigfile
done

আপনার ভেরিয়েবল মানগুলি বিভিন্ন দৈর্ঘ্যের \tহয় তবে আপনাকে printfলাইনে অক্ষরের সংখ্যা (ট্যাব) ম্যাসেজ করতে হবে ।

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