पाठ फ़ाइलों को कॉलम-वार गठबंधन करें


52

मेरे पास दो टेक्स्ट फाइलें हैं। पहले वाले के पास सामग्री है:

Languages
Recursively enumerable
Regular

जबकि दूसरे में सामग्री है:

Minimal automaton
Turing machine
Finite

मैं उन्हें एक फाइल कॉलम-वार में जोड़ना चाहता हूं। इसलिए मैंने कोशिश की paste 1 2और इसका आउटपुट है:

Languages   Minimal automaton
Recursively enumerable  Turing machine
Regular Finite

हालाँकि मैं चाहूंगा कि कॉलम को अच्छी तरह से संरेखित किया जाए

Languages               Minimal automaton
Recursively enumerable  Turing machine
Regular                 Finite

मैं सोच रहा था कि क्या मैन्युअल रूप से हैंडलिंग के बिना इसे प्राप्त करना संभव होगा?


जोड़ा गया:

यहाँ एक और उदाहरण है, जहां ब्रूस ने लगभग नाखूनों की पद्धति को छोड़ दिया, सिवाय इसके कि थोड़ा सा भी भ्रम था जिसके बारे में मुझे आश्चर्य है कि क्यों?

$ cat 1
Chomsky hierarchy
Type-0
—

$ cat 2
Grammars
Unrestricted

$ paste 1 2 | pr -t -e20
Chomsky hierarchy   Grammars
Type-0              Unrestricted
—                    (no common name)

3
यह अंतिम उदाहरण, मिसलिग्न्मेंट के साथ, एक डोज है। मैं इसे आर्क लाइनक्स, पीआर (जीएनयू कोरुटिल्स) 8.12 पर डुप्लिकेट कर सकता हूं। मैं इसे एक बुजुर्ग स्लैकवेयर (11.0) पर डुप्लिकेट नहीं कर सकता हूं मेरे पास भी है: पीआर (जीएनयू कोरुटिल्स) 5.97। समस्या '-' वर्ण के साथ है, और यह जनसंपर्क में है, पेस्ट नहीं।
ब्रूस एडिगर

1
मैं दोनों के साथ ईएम-डीएएस के साथ एक ही बात करता हूं prऔर expand... columnsइस मुद्दे से बचता हूं।
पीटर।

मैंने awk + पेस्ट को छोड़कर अधिकांश अलग-अलग उत्तरों के लिए आउटपुट का उत्पादन किया है , जो कि बाएं-शिफ्ट दाएं-सबसे कॉलम (एस) को छोड़ देगा यदि कोई बाईं फाइल इसके किसी भी टी के दाईं ओर से छोटी है। वही, और अधिक, 'पेस्ट + कॉलम' पर लागू होता है, जो बाएं कॉलम (एस) में रिक्त लाइनों के साथ भी यह समस्या है ... यदि आप सभी आउटपुट को एक साथ देखना चाहते हैं। यहाँ लिंक है: paste.ubuntu.com/643692 मैंने 4 कॉलम का उपयोग किया है।
पीटर।

मैं तो बस पर कुछ भ्रामक देखा paste.ubuntu लिंक ... मैं मूल रूप से मेरी स्क्रिप्ट, के परीक्षण के लिए डेटा की स्थापना की (और है कि दूसरों के लिए कर रही है पर नेतृत्व में) ... इसलिए क्षेत्रों जो कहते हैं कि ➀ unicode may render oddly but the column count is ok निश्चित रूप से करता है नहीं करने के लिए लागू wc-paste-prऔर wc-paste-prवे कॉलम की संख्या के अंतर को दिखाएं .. अन्य ठीक हैं।
पीटर।

1
@BruceEdiger: संरेखण समस्या तब होती है जब गैर-ASCII वर्णों का उपयोग किया जाता है (उनके प्रश्न में, ओपी ने माइनस (-) वर्ण के बजाय एक डैश (-) का उपयोग किया था), शायद prमल्टीबाइट द्वारा खराब या बिना किसी हैंडलिंग के कारण। वर्तमान स्थान (आमतौर पर UTF8) में वर्ण।
श्वेतवर्ण भेड़िया

जवाबों:


68

आपको बस columnकमांड की आवश्यकता है , और इसे कॉलम को अलग करने के लिए टैब का उपयोग करने के लिए कहें

paste file1 file2 | column -s $'\t' -t

"खाली सेल" विवाद को संबोधित करने के लिए, हमें बस निम्नलिखित -nविकल्प की आवश्यकता है column:

$ paste <(echo foo; echo; echo barbarbar) <(seq 3) | column -s $'\t' -t
foo        1
2
barbarbar  3

$ paste <(echo foo; echo; echo barbarbar) <(seq 3) | column -s $'\t' -tn
foo        1
           2
barbarbar  3

मेरा कॉलम मैन पेज इंगित करता -nहै कि "डेबियन जीएनयू / लिनक्स एक्सटेंशन है।" मेरा फेडोरा सिस्टम खाली सेल समस्या का प्रदर्शन नहीं करता है: यह बीएसडी से प्राप्त होता है और मैन पेज कहता है "संस्करण 2.23 ने -s विकल्प को गैर-लालची माना"


4
ग्लेन: आप घंटे के नायक हैं! मुझे पता था कि आसपास कुछ ऐसा था, लेकिन मैं इसे याद नहीं कर सकता था। मैं इस सवाल पर झूठ बोल रहा हूं; आप के लिए इंतजार कर रहे हैं :) ... column, ज़ाहिर है; कितना स्पष्ट (
अशुभ में

4
मैंने अभी देखा है कि column -s $'\t' -tखाली कोशिकाओं को अनदेखा करता है , जिसके परिणामस्वरूप सभी बाद की कोशिकाओं को दाईं ओर (उस रेखा पर) बाईं ओर ले जाया जाता है; अर्थात, किसी फ़ाइल में रिक्त रेखा के परिणामस्वरूप, या यह छोटा होने ... :(
पीटर।

1
@masi, सुधारा गया
ग्लेन जैकमैन

-आरएचईएल में काम नहीं करता है। क्या कोई विकल्प है?
कोशुर

मैं अंत में टिप्पणी कर सकता हूं, इसलिए यह नोट करना चाहता हूं कि मैंने पहले एक जवाब नीचे जोड़ा था जो पीटरो को संबोधित करता है। रिक्त कोशिकाओं के रन के साथ नल का उपयोग करके जारी करता है।
टेक्नो

11

आप आसान काम prकमांड के लिए देख रहे हैं :

paste file1 file2 | pr -t -e24

"-E24" "24 स्थानों के लिए टैब स्टॉप का विस्तार" है। सौभाग्य से, pasteस्तंभों के बीच एक टैब-चरित्र डालता है, इसलिए prइसका विस्तार कर सकते हैं। मैंने "रिकर्सिवली एनुमेरबल" में पात्रों को गिनकर और 2 जोड़कर 24 को चुना।


धन्यवाद! "24 स्थानों पर टैब स्टॉप का विस्तार" का क्या मतलब है?
टिम

मैं एक उदाहरण के साथ भी अपडेट करता हूं, जहां आपकी विधि एक मामूली मिसलिग्न्मेंट को छोड़कर लगभग नाखूनों को काटती है।
टिम

परंपरागत रूप से "टैबस्टॉप्स" हर 8 स्थानों पर हिट होता है। "123TABabc" लाइन की शुरुआत से 'ए' अक्षर 8 वर्ण-चौड़ाई के साथ मुद्रित हो जाएगा। इसे 24 पर सेट करने से लाइन के शुरू होने से 24 '' चौड़ी चौड़ाई पर '' ए '' लगाया जाएगा।
ब्रूस एडिगर

आप कहते हैं कि "-24" "24 स्थानों पर टैब स्टॉप का विस्तार" है , इसलिए expandसीधे कमांड का उपयोग क्यों न करें paste file1 file2 | expand -t 24:?
व्हाइटवॉन्डवॉल्फ

1
@ मासी - मेरा उत्तर समान है लेकिन कम जटिल है कि @ तकनीकी उत्तर नीचे है। यह आह्वान नहीं करता है sedइसलिए एक प्रक्रिया है जो नहीं चलती है। यह prएक प्राचीन कमांड है, जो यूनिक्स SysV दिनों के लिए डेटिंग का उपयोग करता है, मुझे लगता है, इसलिए यह अधिक से अधिक इंस्टॉल पर मौजूद हो सकता है expand। यह सिर्फ पुराने स्कूल है, संक्षेप में।
ब्रूस एडिगर

9

अद्यतन : यहाँ एक बहुत सरल स्क्रिप्ट है (कि सवाल के अंत में एक) सारणीबद्ध आउटपुट के लिए। जैसा कि आप चाहते हैं, बस इसे फ़ाइल नाम दें paste... यह htmlफ्रेम बनाने के लिए उपयोग करता है, इसलिए यह tweakable है। यह कई स्थानों को संरक्षित करता है, और जब यह यूनिकोड वर्णों का सामना करता है तो कॉलम संरेखण संरक्षित होता है। हालांकि, जिस तरह से संपादक या दर्शक यूनिकोड को प्रस्तुत करते हैं वह पूरी तरह से एक और मामला है ...

┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ Languages            │ Minimal        │ Chomsky  │ Unrestricted               │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Recursive            │ Turing machine │ Finite   │     space indented         │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Regular              │ Grammars       │          │ ➀ unicode may render oddly │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ 1 2  3   4    spaces │                │ Symbol-& │ but the column count is ok │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│                      │                │          │ Context                    │
└──────────────────────┴────────────────┴──────────┴────────────────────────────┘

#!/bin/bash
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
  paste "$@" |sed -re 's#(.*)#\x09\1\x09#' -e 's#\x09# </pre></td>\n<td><pre> #g' -e 's#^ </pre></td>#<tr>#' -e 's#\n<td><pre> $#\n</tr>#'
  echo -e "</table>\n</html>"
} |w3m -dump -T 'text/html'

---

उत्तर (अब तक) में प्रस्तुत किए गए उपकरणों का एक सारांश
मैंने उन पर बहुत करीबी नज़र डाली है; यहाँ मैं क्या पाया है:

paste# यह उपकरण अब तक प्रस्तुत सभी उत्तरों के लिए सामान्य है # यह कई फाइलों को संभाल सकता है; इसलिए कई कॉलम ... अच्छा! # यह प्रत्येक कॉलम को टैब के साथ परिसीमित करता है ... अच्छा। # इसका आउटपुट सारणीबद्ध नहीं है।

नीचे दिए गए सभी उपकरण इस सीमांकक को हटा देते हैं! ... यदि आपको एक सीमांकक की आवश्यकता है तो बुरा है।

column # यह टैब सीमांकक को हटाता है, इसलिए फ़ील्ड आइडेंटिफ़टन विशुद्ध रूप से स्तंभों द्वारा होता है जिसे यह काफी अच्छी तरह से संभालता हुआ लगता है .. मुझे कुछ भी अटपटा नहीं लगा है ... # एक अद्वितीय सीमांकक नहीं होने के बावजूद, यह ठीक काम करता है!

expand # केवल एक एकल टैब सेटिंग है, इसलिए यह 2 कॉलम से परे अप्रत्याशित है # यूनिकोड को संभालते समय स्तंभों का संरेखण सही नहीं है, और यह टैब सीमांकक को हटा देता है, इसलिए फ़ील्ड आइडेंटिटोन शुद्ध रूप से कॉलम संरेखण द्वारा होता है

pr# केवल एक ही टैब सेटिंग है, इसलिए यह 2 कॉलम से परे अप्रत्याशित है। # यूनिकोड को संभालते समय स्तंभों का संरेखण सही नहीं है, और यह टैब सीमांकक को हटा देता है, इसलिए फ़ील्ड आइडेंटिफैटन शुद्ध रूप से स्तंभ संरेखण द्वारा होता है

मेरे लिए, columnयह एक लाइनर के रूप में स्पष्ट सबसे अच्छा विलेय है .. यह आप या तो सीमांकक चाहते हैं, या आपकी फ़ाइलों के एक ASCII- कला सारणी, पर पढ़ें, अन्यथा .. columnsबहुत सुंदर है अच्छा :) ...


यहाँ एक स्क्रिप्ट है जो किसी भी प्रकार की फाइलों को ले जाती है और एक ASCII- कला सारणीबद्ध प्रस्तुति बनाती है .. (ध्यान रखें कि यूनिकोड अपेक्षित चौड़ाई को प्रस्तुत नहीं कर सकता है, उदाहरण के लिए ௵ जो एक एकल वर्ण है। यह स्तंभ के लिए काफी भिन्न है। संख्या गलत है, जैसा कि ऊपर वर्णित कुछ उपयोगिताओं में मामला है।) ... स्क्रिप्ट का आउटपुट, नीचे दिखाया गया है, 4 इनपुट फ़ाइलों से है, जिसका नाम F1 F2 F3 F4 है ...

+------------------------+-------------------+-------------------+--------------+
| Languages              | Minimal automaton | Chomsky hierarchy | Grammars     |
| Recursively enumerable | Turing machine    | Type-0            | Unrestricted |
| Regular                | Finite            | —                 |              |
| Alphabet               |                   | Symbol            |              |
|                        |                   |                   | Context      |
+------------------------+-------------------+-------------------+--------------+

#!/bin/bash

# Note: The next line is for testing purposes only!
set F1 F2 F3 F4 # Simulate commandline filename args $1 $2 etc...

p=' '                                # The pad character
# Get line and column stats
cc=${#@}; lmax=                      # Count of columns (== input files)
for c in $(seq 1 $cc) ;do            # Filenames from the commandline 
  F[$c]="${!c}"        
  wc=($(wc -l -L <${F[$c]}))         # File length and width of longest line 
  l[$c]=${wc[0]}                     # File length  (per file)
  L[$c]=${wc[1]}                     # Longest line (per file) 
  ((lmax<${l[$c]})) && lmax=${l[$c]} # Length of longest file
done
# Determine line-count deficits  of shorter files
for c in $(seq 1 $cc) ;do  
  ((${l[$c]}<lmax)) && D[$c]=$((lmax-${l[$c]})) || D[$c]=0 
done
# Build '\n' strings to cater for short-file deficits
for c in $(seq 1 $cc) ;do
  for n in $(seq 1 ${D[$c]}) ;do
    N[$c]=${N[$c]}$'\n'
  done
done
# Build the command to suit the number of input files
source=$(mktemp)
>"$source" echo 'paste \'
for c in $(seq 1 $cc) ;do
    ((${L[$c]}==0)) && e="x" || e=":a -e \"s/^.{0,$((${L[$c]}-1))}$/&$p/;ta\""
    >>"$source" echo '<(sed -re '"$e"' <(cat "${F['$c']}"; echo -n "${N['$c']}")) \'
done
# include the ASCII-art Table framework
>>"$source" echo ' | sed  -e "s/.*/| & |/" -e "s/\t/ | /g" \'   # Add vertical frame lines
>>"$source" echo ' | sed -re "1 {h;s/[^|]/-/g;s/\|/+/g;p;g}" \' # Add top and botom frame lines 
>>"$source" echo '        -e "$ {p;s/[^|]/-/g;s/\|/+/g}"'
>>"$source" echo  
# Run the code
source "$source"
rm     "$source"
exit

यहाँ मेरा मूल उत्तर है (उपरोक्त लिपि के बदले थोड़ा सा छांटा गया है)

का उपयोग करते हुए wcस्तंभ चौड़ाई प्राप्त करने के लिए, और sedएक साथ सही पैड को दिखाई चरित्र .तो (सिर्फ इस उदाहरण के लिए) ... और pasteएक साथ दो कॉलम शामिल होने के लिए टैब चार ...

paste <(sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1) F2

# output (No trailing whitespace)
Languages.............  Minimal automaton
Recursively enumerable  Turing machine
Regular...............  Finite

यदि आप सही कॉलम को बाहर निकालना चाहते हैं:

paste <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1 ) \
      <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F2)-1))"'}$/&./;ta' F2 )  

# output (With trailing whitespace)
Languages.............  Minimal automaton
Recursively enumerable  Turing machine...
Regular...............  Finite...........

धन्यवाद! आपने काफी काम किया है। वह आश्चर्यजनक है।
टिम

5

तुम लगभग वहां थे। pasteप्रत्येक स्तंभ के बीच एक टैब वर्ण रखता है, इसलिए आपको केवल टैब को विस्तारित करने की आवश्यकता है। (मुझे लगता है कि आपकी फ़ाइलों में टैब नहीं हैं।) आपको बाएं कॉलम की चौड़ाई निर्धारित करने की आवश्यकता है। जीएनयू उपयोगिताओं के साथ (हाल ही में पर्याप्त), wc -Lसबसे लंबी लाइन की लंबाई दिखाता है। अन्य प्रणालियों पर, awk के साथ पहला पास बनाएं। +1खाली स्थान की मात्रा आप स्तंभों के बीच चाहते हैं।

paste left.txt right.txt | expand -t $(($(wc -L <left.txt) + 1))
paste left.txt right.txt | expand -t $(awk 'n<length {n=length} END {print n+1}')

यदि आपके पास बीएसडी कॉलम उपयोगिता है, तो आप इसका उपयोग कॉलम की चौड़ाई निर्धारित करने और एक बार में टैब का विस्तार करने के लिए कर सकते हैं। ( एक शाब्दिक टैब वर्ण है; बैश / ksh / zsh के तहत आप $'\t'इसके बजाय उपयोग कर सकते हैं , और किसी भी शेल में आप उपयोग कर सकते हैं "$(printf '\t')"।)

paste left.txt right.txt | column -s '␉' -t

मेरे संस्करण में wc, कमांड होने की आवश्यकता है: wc -L <left.txt... क्योंकि, जब एक फ़ाइल नाम को कमांड लाइन arg के रूप में फैलाया जाता है , तो इसका नाम stdout में आउटपुट होता है
पीटर।

4

यह बहु-चरण है, इसलिए यह गैर-इष्टतम है, लेकिन यहां जाता है।

1) सबसे लंबी लाइन की लंबाई का पता लगाएं file1.txt

while read line
do
echo ${#line}
done < file1.txt | sort -n | tail -1

आपके उदाहरण के साथ, सबसे लंबी रेखा 22 है।

2) स्टेट के लिए awk to pad का प्रयोग करें file1.txt, प्रत्येक लाइन को 22 वर्णों तक कम से कम 22 तक printfकथन के साथ पैडिंग करें ।

awk 'FS="---" {printf "%-22s\n", $1}' < file1.txt > file1-pad.txt

नोट: FS के लिए, एक स्ट्रिंग का उपयोग करें जो कि मौजूद नहीं है file1.txt

3) पेस्ट का उपयोग करें जैसा आपने पहले किया था।

$ paste file1-pad.txt file2.txt
Languages               Minimal automaton
Recursively enumerable  Turing machine
Regular                 Finite

यदि यह कुछ ऐसा है जो आप अक्सर करते हैं, तो यह आसानी से एक स्क्रिप्ट में बदल सकता है।


सबसे लंबी लाइन को खोजने के लिए आपके कोड में, आपको आवश्यकता है while IFS= read -r line, अन्यथा शेल व्हॉट्सएप और बैकस्लैश को मैंग करेगा। लेकिन शेल उस नौकरी के लिए सबसे अच्छा साधन नहीं है; GNU coreutils के हाल के संस्करणों है wc -L(फ्रेड के जवाब देखें), या आप awk का उपयोग कर सकते हैं: awk 'n<length {n=length} END {print +n}'
गिलेस एसओ- बुराई को रोकना '

4

मैं ग्लेन जैकमैन के जवाब पर टिप्पणी करने में असमर्थ हूं, इसलिए पीटरो द्वारा उल्लेखित खाली कोशिकाओं के मुद्दे को संबोधित करने के लिए इसे जोड़ रहा हूं। प्रत्येक टैब से पहले एक अशक्त चार को जोड़ने से डेलिमिटर के रन समाप्त हो जाते हैं जिन्हें एक ब्रेक के रूप में माना जाता है और मुद्दे को संबोधित करता है। (मैं मूल रूप से रिक्त स्थान का उपयोग करता था, लेकिन अशक्त चार का उपयोग करने से स्तंभों के बीच अतिरिक्त स्थान समाप्त हो जाता है।)

paste file1 file2 | sed 's/\t/\0\t/g' | column -s $'\t' -t

यदि नल चार विभिन्न कारणों से समस्याओं का कारण बनता है, तो या तो प्रयास करें:

paste file1 file2 | sed 's/\t/ \t/g' | column -s $'\t' -t

या

paste file1 file2 | sed $'s/\t/ \t/g' | column -s $'\t' -t

दोनों sedऔर columnजायके और यूनिक्स / लिनक्स, विशेष रूप से बीएसडी (और मैक ओएस एक्स) बनाम जीएनयू / लिनक्स के संस्करणों में कार्यान्वयन में भिन्न दिखाई देते हैं।


वह sed कमांड कुछ भी नहीं करता प्रतीत होता है। मैं कॉलम कमांड को प्रतिस्थापित करता od -cहूं और मुझे कोई अशक्त बाइट नहीं दिखता है। यह सेंटोस और ubuntu पर है।
ग्लेन जैकमैन

1
इसने मेरे लिए रेडहैट ईएल 4 में काम किया। दोनों सेड और कॉलम समय और प्रणाली में भिन्न होते हैं। उबंटू में 14.4 का उपयोग करके सेड में \0काम नहीं किया null, लेकिन \x0किया। हालाँकि, तब स्तंभ ने एक line too longत्रुटि दी थी । एक जगह का उपयोग करने और अतिरिक्त चरित्र के साथ रहने के लिए सबसे सरल बात लगती है।
टेक्नो

0

भवन के उत्तर पर निर्माण : यह पूरी तरह से किया जा सकता है awk, केवल एक बार फ़ाइलों को पढ़ना और कोई अस्थायी फ़ाइलें नहीं बनाना। जैसा कि कहा गया है, समस्या को हल करने के लिए

awk '
        NR==FNR { if (length > max_length) max_length = length
                  max_FNR = FNR
                  save[FNR] = $0
                  next
                }
                { printf "%-*s", max_length+2, save[FNR]
                  print
                }
        END     { if (FNR < max_FNR) {
                        for (i=FNR+1; i <= max_FNR; i++) print save[i]
                  }
                }
    '   file1 file2

awkइस ilk की कई लिपियों के साथ , उपरोक्त पहले पढ़ता है file1, saveसरणी में सभी डेटा को सहेज रहा है और साथ ही साथ अधिकतम लाइन की लंबाई की गणना कर रहा है। फिर यह file2 सहेजे गए ( file1) डेटा को साइड-बाय-साइड (वर्तमान file2) डेटा के साथ प्रिंट करता है और प्रिंट करता है । अंत में, यदि file1अधिक समय है file2(अधिक लाइनों है), हम के अंतिम कुछ लाइनों प्रिंट file1 (लोगों जिसके लिए वहाँ दूसरे कॉलम में कोई संगत लाइन है)।

printfप्रारूप के बारे में :

  • "%-nns"एक स्ट्रिंग में छोड़े गए एक तार को एक nnचौड़े पात्र में प्रिंट करता है ।
  • "%-*s", nnएक ही बात करता है - *यह अगले पैरामीटर से क्षेत्र की चौड़ाई लेने के लिए कहता है।
  • का उपयोग करके के लिए , हम स्तंभों के बीच दो रिक्त स्थान मिलता है। जाहिर है समायोजित किया जा सकता है।maxlength+2nn+2

उपरोक्त स्क्रिप्ट केवल दो फ़ाइलों के लिए काम करती है। यह तीन फाइलों को संभालने के लिए, या चार फाइलों को संभालने के लिए तुच्छ रूप से संशोधित किया जा सकता है, लेकिन यह थकाऊ होगा और इसे अभ्यास के रूप में छोड़ दिया जाता है। हालांकि, यह पता चला है कि किसी भी संख्या में फ़ाइलों को संभालने के लिए इसे संशोधित करना मुश्किल नहीं है :

awk '
        FNR==1  { file_num++ }
                { if (length > max_length[file_num]) max_length[file_num] = length
                  max_FNR[file_num] = FNR
                  save[file_num,FNR] = $0
                }
        END     { for (j=1; j<=file_num; j++) {
                        if (max_FNR[j] > global_max_FNR) global_max_FNR = max_FNR[j]
                  }
                  for (i=1; i<=global_max_FNR; i++) {
                        for (j=1; j<file_num; j++) printf "%-*s", max_length[j]+2, save[j,i]
                        print save[file_num,i]
                  }
                }
    '   file*

यह मेरी पहली लिपि के समान है, सिवाय इसके

  • यह max_lengthएक सरणी में बदल जाता है ।
  • यह max_FNRएक सरणी में बदल जाता है ।
  • यह saveद्वि-आयामी सरणी में बदल जाता है ।
  • यह पढ़ता है सभी फाइलें, बचत सभी सामग्री। फिर यह ब्लॉक से सभी आउटपुट को लिखता है END

मुझे पता है कि यह सवाल पुराना है; मैं बस उस पर फिदा हो गया। मैं मानता हूं कि pasteसबसे अच्छा समाधान है; विशेष रूप से, ग्लेन जैकमैन paste file1 file2 | column -s $'\t' -t। लेकिन मुझे लगा कि awkदृष्टिकोण में सुधार करने की कोशिश करना मजेदार होगा ।
जी-मैन का कहना है कि 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.