ট্যাব-সীমাবদ্ধ কলামগুলি আউটপুট দেওয়ার জন্য একটি সাধারণ কমান্ড আছে?


67

যেমন আমার কাছে একটি ফাইল রয়েছে (এর সাথে উত্পাদিত echo -e "var1\tvar2\t\var3\tvar4" > foo) যা আউটপুট হিসাবে:

$ cat foo
case    elems   meshing nlsys
uniform 2350    0.076662        2.78
non-conformal   348     0.013332        0.55
scale   318     0.013333        0.44
smarter 504     0.016666        0.64
submodel        360     .009999 0.40
unstruct-quad   640     0.019999        0.80
unstruct-tri    1484    0.01    0.88

আমি এই জাতীয় আউটপুট পছন্দ করব (এখানে আমি ব্যবহার করেছি vimএবং :set tabstop=14):

case          elems         meshing       nlsys
uniform       2350          0.076662      2.78
non-conformal 348           0.013332      0.55
scale         318           0.013333      0.44
smarter       504           0.016666      0.64
submodel      360           .009999       0.40
unstruct-quad 640           0.019999      0.80
unstruct-tri  1484          0.01          0.88

catযদি আমি $ tabs=15ব্যাশে ব্যবহার করি তবে আমি একই কার্যকারিতাটি পেতে পারি (এই প্রশ্নটি দেখুন )। এমন কোনও প্রোগ্রাম রয়েছে যা স্বয়ংক্রিয়ভাবে এই জাতীয় বিন্যাস করে? কোনও ফাইল যুক্ত করার tabsআগে আমি মানটি নিয়ে পরীক্ষা করতে চাই না cat

উত্তর:


87

আমি সাধারণত columnএটির জন্য প্রোগ্রামটি ব্যবহার করি , এটি bsdmainutilsডেবিয়ান নামে পরিচিত একটি প্যাকেজে রয়েছে :

column -t foo

আউটপুট:

case           elems  meshing   nlsys
uniform        2350   0.076662  2.78
non-conformal  348    0.013332  0.55
scale          318    0.013333  0.44
smarter        504    0.016666  0.64
submodel       360    .009999   0.40
unstruct-quad  640    0.019999  0.80
unstruct-tri   1484   0.01      0.88

column(1)আমার সিস্টেমে থেকে উদ্ধৃত অংশ :

...

-t      Determine the number of columns the input contains and create a
        table.  Columns are delimited with whitespace, by default, or
        with the characters supplied using the -s option.  Useful for
        pretty-printing displays.

...

মহান! অনেক ধন্যবাদ! এটি ইতিমধ্যে আমার মেশিনে ইনস্টল করা আছে।
সেবাস্তিয়ান

11
-s $'\t'কিছু ক্ষেত্রে শূন্যস্থান রয়েছে এমন ক্ষেত্রে আপনি (যদিও প্রতিটি কলাম বাস্তবায়নে পাওয়া যায়নি) যুক্ত করতে চাইতে পারেন ।
স্টাফেন চেজেলাস

2
@ রাখোলিয়া জেনিশ $'\t'মানে ট্যাব চরিত্র। নতুন লাইন $'\n'এবং তাই।
মানভে

2
আমি এটি হিসাবে ব্যবহার column -ts: /etc/passwd। শান্ত দেখায়!
kyb

1
@ কেবি: এর সাথে আরও ভাল দেখাচ্ছে -n, অর্থাত্ একাধিক সংলগ্ন সীমানা সংযোজন এড়াতে
থোর

10

বিভিন্ন বিকল্প:

var1=uniform var2=2350 var3=0.076662 var4=2.78

printf '%-15s %-10s %-12s %s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4"

printf '%s\t%s\t%s\t%s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4" |
  expand -t 15,25,37

printf '%s\t%s\t%s\t%s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4" |
  column -t -s $'\t'

কলামটি একটি মানহীন কমান্ড, কিছু বাস্তবায়ন / সংস্করণ -s বিকল্পকে সমর্থন করে না। এটি ইনপুটটির উপর ভিত্তি করে কলামটির প্রস্থকে গণনা করে, তবে এর অর্থ হ'ল এটি সমস্ত ইনপুটটি খাওয়ানো হলে এটি কেবল প্রদর্শন শুরু করতে পারে। $'...'ksh93 সিনট্যাক্সটি zsh এবং ব্যাশে পাওয়া যায়।

Zsh সহ:

values=(
  case elems messing nlsys
  "$var1" "$var2" "$var3" "$var4"
)
print -arC4 -- "$values[@]"

4

আপনি এর rsবিকল্প হিসাবেও ব্যবহার করতে পারেন column -t:

(x=$(cat);rs -c -z $(wc -l<<<"$x")<<<"$x")

-cইনপুট কলাম বিভাজক পরিবর্তন করে, তবে -cএকা ট্যাবতে ইনপুট কলাম বিভাজক সেট করে। -zসমস্ত কলাম একই প্রস্থের পরিবর্তে কলামের দীর্ঘতম প্রবেশের প্রস্থে প্রতিটি কলামের প্রস্থকে সেট করে। কিছু লাইনে যদি প্রথম লাইনের চেয়ে কম কলাম থাকে তবে যুক্ত করুন -n


কোনটি rs? আমার সেন্টস বা আমার উবুন্টু / মিন্ট সিস্টেমগুলিতে এই কমান্ডটি ইনস্টল করা হয়নি।
অ্যান্থন

1
@ অ্যানথন এটি একটি বিএসডি কমান্ড যা এটি ওএস এক্স এর সাথে আসে, এপিএলে পুনরায় আকার ফাংশনটির নাম অনুসারে। দেবিয়ান প্যাকেজের নামটি ঠিক rs, তাই আপনি এটি দিয়ে এটি ইনস্টল করতে পারেন apt-get install rs
নিসেতাম

আপনি কীভাবে কমান্ডটি কল করবেন তার উদাহরণ দিতে পারেন (x=$(cat);rs -c -z $(wc -l<<<"$x")<<<"$x")? আমি জানি না যে আমি কীভাবে এটি একটি
সিএসভি

3

আরেকটি সরঞ্জাম যা এটা করতে পারেন হয় tsv-prettyথেকে ইবে এর TSV উপযোগিতা (: আমি লেখক নই দাবিত্যাগ)। দশমিক বিন্দুতে অঙ্কের ক্ষেত্রগুলি আস্তরণের অতিরিক্ত পদক্ষেপ নেয়। উদাহরণ স্বরূপ:

$ tsv-pretty foo
case           elems   meshing  nlsys
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360   .009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.01       0.88

বিভিন্ন ফর্ম্যাটিং বিকল্প রয়েছে। উদাহরণস্বরূপ, -uশিরোনামটিকে আন্ডারলাইন করে এবং -fপাঠযোগ্যতার জন্য একইভাবে একটি ফিল্ডে ভাসমানগুলি ফর্ম্যাট করে:

$ tsv-pretty foo -f -u
case           elems   meshing  nlsys
----           -----   -------  -----
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360  0.009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.010000   0.88

Tsv- সুন্দর রেফারেন্সে আরও তথ্য উপলব্ধ ।


এটি সত্যই সহায়ক
আরেফে

1

প্রশ্নটি ট্যাব সীমিত কলামগুলি আউটপুট দেওয়ার বিষয়ে ছিল।

সুতরাং সঠিক উত্তরটি হলেন @নিসেটামার উত্তরের একটি ছোট্ট অভিযোজন। আমি -C $ '\ t' বিকল্প যুক্ত করেছি যা আউটপুট বিন্যাস সেট করে।

x=$(cat foo2); rs -C$'\t' $(wc -l <<<"$x") <<<"$x"

কুডো @ সিনিসটামায় যদিও :)


1
function printTable()
{
    local -r delimiter="${1}"
    local -r data="$(removeEmptyLines "${2}")"

    if [[ "${delimiter}" != '' && "$(isEmptyString "${data}")" = 'false' ]]
    then
        local -r numberOfLines="$(wc -l <<< "${data}")"

        if [[ "${numberOfLines}" -gt '0' ]]
        then
            local table=''
            local i=1

            for ((i = 1; i <= "${numberOfLines}"; i = i + 1))
            do
                local line=''
                line="$(sed "${i}q;d" <<< "${data}")"

                local numberOfColumns='0'
                numberOfColumns="$(awk -F "${delimiter}" '{print NF}' <<< "${line}")"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi

                # Add Header Or Body

                table="${table}\n"

                local j=1

                for ((j = 1; j <= "${numberOfColumns}"; j = j + 1))
                do
                    table="${table}$(printf '#| %s' "$(cut -d "${delimiter}" -f "${j}" <<< "${line}")")"
                done

                table="${table}#|\n"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]] || [[ "${numberOfLines}" -gt '1' && "${i}" -eq "${numberOfLines}" ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi
            done

            if [[ "$(isEmptyString "${table}")" = 'false' ]]
            then
                echo -e "${table}" | column -s '#' -t | awk '/^\+/{gsub(" ", "-", $0)}1'
            fi
        fi
    fi
}

function removeEmptyLines()
{
    local -r content="${1}"

    echo -e "${content}" | sed '/^\s*$/d'
}

function repeatString()
{
    local -r string="${1}"
    local -r numberToRepeat="${2}"

    if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]]
    then
        local -r result="$(printf "%${numberToRepeat}s")"
        echo -e "${result// /${string}}"
    fi
}

function isEmptyString()
{
    local -r string="${1}"

    if [[ "$(trimString "${string}")" = '' ]]
    then
        echo 'true' && return 0
    fi

    echo 'false' && return 1
}

function trimString()
{
    local -r string="${1}"

    sed 's,^[[:blank:]]*,,' <<< "${string}" | sed 's,[[:blank:]]*$,,'
}

নমুনা চালানো

$ cat data-1.txt
HEADER 1,HEADER 2,HEADER 3

$ printTable ',' "$(cat data-1.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+

$ cat data-2.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3

$ printTable ',' "$(cat data-2.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
+-----------+-----------+-----------+

$ cat data-3.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3
data 4,data 5,data 6

$ printTable ',' "$(cat data-3.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
| data 4    | data 5    | data 6    |
+-----------+-----------+-----------+

$ cat data-4.txt
HEADER
data

$ printTable ',' "$(cat data-4.txt)"
+---------+
| HEADER  |
+---------+
| data    |
+---------+

$ cat data-5.txt
HEADER

data 1

data 2

$ printTable ',' "$(cat data-5.txt)"
+---------+
| HEADER  |
+---------+
| data 1  |
| data 2  |
+---------+

REF LIB at: https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash


আকর্ষণীয় বাশ-কেবল সমাধান - ভাগ করে নেওয়ার জন্য ধন্যবাদ
সেবাস্তিয়ান

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