2012-10-07 15 views
28

मैं एक टेबल प्रारूप टेक्स्ट आउटपुट करना चाहता हूं। मैंने जो करने की कोशिश की वह एक सरणी के तत्वों को '\ t' के साथ गूंज रहा था लेकिन इसे गलत तरीके से गलत किया गया था। मेरी कोडबैश आउटपुट टेबल्स

for((i=0;i<array_size;i++)); 
do 
    echo stringarray[$i] $'\t' numberarray[$i] $'\t' anotherfieldarray[$i] 
done; 

मेरे उत्पादन

a very long string..........  112232432  anotherfield 
a smaller string   123124343  anotherfield 

वांछित उत्पादन

a very long string..........  112232432  anotherfield 
a smaller string     123124343  anotherfield 

उत्तर

39

printf एक अद्भुत छोटे प्रोग्राम है कि कई लोगों को भूल मौजूद है। यह बल्कि शक्तिशाली है।

$ for num in 1 10 100 1000 10000 100000 1000000; do printf "%10s %s\n" $num "foobar"; done 
     1 foobar 
     10 foobar 
     100 foobar 
     1000 foobar 
    10000 foobar 
    100000 foobar 
    1000000 foobar 

$ for((i=0;i<array_size;i++)); 
do 
    printf "%10s %10d %10s" stringarray[$i] numberarray[$i] anotherfieldarray[%i] 
done 

नोटिस मैंने स्ट्रिंग के लिए %10s का उपयोग किया। %s महत्वपूर्ण हिस्सा है। यह एक स्ट्रिंग का उपयोग करने के लिए कहता है। मध्य में 10 कहता है कि यह कितने कॉलम होना है। %d संख्यात्मक (अंक) के लिए है। अधिक जानकारी के लिए

man 1 printf

+14

केवल एक सलाह जो टेबल प्रिंट करते समय उपयोगी होती है: '% -10s' wiil लंबाई 10 के बाएं-गठबंधन तार उत्पन्न करती है – steffen

74

उपयोग स्तंभ आदेश:

column -t -s' ' filename 
+0

'printf' भी उपयोगी हो सकता है। – Mat

+2

इस तरह की अपनी जरूरतों को फिट नहीं करता है। –

+0

@sputnick यह वास्तव में उसकी जरूरतों को फिट करता है। कारण वह '\ t' करता है, जो अनावश्यक है, वह एक सारणीबद्ध स्तंभ स्वयं करना है जो शब्दों के बीच एक निश्चित लंबाई स्थान देता है। उसे केवल आउटपुट को 'कॉलम' पर पाइप करना है। –

5

ठीक उसी उत्पादन करने के लिए के रूप में आप की जरूरत है, तो आप प्रारूप करने की जरूरत है ऐसे ही फ़ाइल:

a very long string..........\t  112232432\t  anotherfield\n 
a smaller string\t  123124343\t  anotherfield\n 

और फिर का उपयोग कर:

$ column -t -s $'\t' FILE 
a very long string.......... 112232432 anotherfield 
a smaller string    123124343 anotherfield 
+0

'$' में '$' 't'' क्या कर रहा है? – rjmunro

+0

यह बैश सिंटैक्स में एक टैब है, http://mywiki.wooledge.org/Quotes –

+0

टैबस्टॉप का उपयोग पूरी तरह से अनुपयोगी हो जाता है यदि 2 कॉलम आकार में लगभग 5 वर्णों से अधिक भिन्न होते हैं। – UtahJarhead

3

यह सुनिश्चित नहीं है कि आप इसे कहां चला रहे थे, लेकिन आपके द्वारा पोस्ट किया गया कोड आपके द्वारा प्रदत्त आउटपुट का उत्पादन नहीं करेगा, कम से कम उस बैश में नहीं जिसे मैं परिचित हूं।

ऐसा करें:

stringarray=('test' 'some thing' 'very long long long string' 'blah') 
numberarray=(1 22 7777 8888888888) 
anotherfieldarray=('other' 'mixed' 456 'data') 
array_size=4 

for((i=0;i<array_size;i++)) 
do 
    echo ${stringarray[$i]} $'\x1d' ${numberarray[$i]} $'\x1d' ${anotherfieldarray[$i]} 
done | column -t -s$'\x1d' 

ध्यान दें कि मैं समूह विभाजक वर्ण (1 दिन) टैब के intead उपयोग कर रहा हूँ, यदि आप एक फ़ाइल से इन सरणियों हो रही है, वे टैब शामिल हो सकता है क्योंकि।

1

यह आपके विचार से आसान है।

आप के साथ काम कर रहे हैं अर्धविराम फ़ाइल और शीर्ष लेख बहुत से अलग कर दिया:

$ (head -n1 file.csv && sort file.csv | grep -v <header>) | column -s";" -t 

आप (विभाजक के रूप में टैब का उपयोग करके) सरणी के साथ काम कर रहे हैं, तो:

for((i=0;i<array_size;i++)); 
do 

    echo stringarray[$i] $'\t' numberarray[$i] $'\t' anotherfieldarray[$i] >> tmp_file.csv 

done; 

cat file.csv | column -t 
0
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 | 
+---------+ 

RE एफ LIB पर: https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash

संबंधित मुद्दे