কলামযুক্ত পাঠ্য ফাইল একত্রিত করুন


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 এ নকল করতে পারি। আমি এটি কোনও প্রবীণ স্ল্যাকওয়্যার (১১.০) এর সদৃশ করতে পারি না আমার আশেপাশে রয়েছে: জনসাধারণ (জিএনইউ কোর্টিলস) 5.97। সমস্যাটি '-' চরিত্রের সাথে রয়েছে এবং এটি প্রাইমে রয়েছে, পেস্ট করে নয়।
ব্রুস এডিগার

1
আমি উভয়ই ইএম-ড্যাসের সাথে একই জিনিস পেয়েছি prএবং expand... columnsএই সমস্যাটি এড়িয়ে চলে।
পিটার.ও

আমি awk + পেস্ট ব্যতীত বিভিন্ন উত্তরগুলির বেশিরভাগের জন্য আউটপুট তৈরি করেছি যা বাম-শিফট ডান-সর্বাধিক কলাম (গুলি) টি বাম ফাইল যদি তার ডানদিকের চেয়ে কোনও অংশের চেয়ে ছোট হয়। একই এবং আরও অনেকগুলি 'পেস্ট + কলাম' এ প্রযোজ্য যার বাম কলাম (গুলি) এর ফাঁকা লাইনগুলির সাথেও এই সমস্যা রয়েছে ... আপনি যদি সমস্ত আউটপুট একসাথে দেখতে চান তবে। এখানে লিঙ্কটি দেওয়া হয়েছে: paste.ubuntu.com/643692 আমি 4 টি কলাম ব্যবহার করেছি।
পিটার.ও

আমি কেবল পেস্ট.বুন্টু লিঙ্কটিতে বিভ্রান্তিকর কিছু লক্ষ্য করেছি ... আমি আমার স্ক্রিপ্টগুলি পরীক্ষার জন্য মূলত ডেটা সেট আপ করেছি, (এবং এটি অন্যকে করার দিকে পরিচালিত করে) ... তাই ক্ষেত্রগুলি যা ➀ unicode may render oddly but the column count is ok স্পষ্টভাবে বলে সেগুলি প্রয়োগ হয় নাwc-paste-pr এবং wc-paste-prতারা কলাম গণনা পার্থক্য দেখান .. অন্যান্য ঠিক আছে।
পিটার.ও

1
@ ব্রুসইডিগার: প্রান্তিককরণের সমস্যা দেখা দেয় যখন অ-এসসিআইআই অক্ষর ব্যবহার করা হয় (তাঁর প্রশ্নে, ওপি একটি বিয়োগ (-) অক্ষরের পরিবর্তে ড্যাশ (-) ব্যবহার করে, সম্ভবত সম্ভবত 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হ'ল "ডেবিয়ান জিএনইউ / লিনাক্স এক্সটেনশন"। আমার ফেডোরা সিস্টেমটি ফাঁকা ঘর সমস্যা প্রদর্শন করে না: এটি BSD থেকে উদ্ভূত বলে মনে হয়েছে এবং ম্যান পৃষ্ঠাটি "সংস্করণ ২.২৩ -কে বিকল্পটিকে অ-লোভী বলে পরিবর্তন করেছে"


4
গ্লেন: আপনি সময়ের নায়ক! আমি জানতাম যে এর চারপাশে এরকম কিছু আছে তবে আমি এটি মনে করতে পারি না। আমি এই প্রশ্ন ঘৃণা করা হয়েছে; জন্য অপেক্ষা আপনি :) ... column, অবশ্যই; কতটা স্পষ্ট (
পর্দার

4
আমি সবেমাত্র লক্ষ্য করেছি যে column -s $'\t' -tখালি ঘরগুলি উপেক্ষা করে ফলস্বরূপ পরবর্তী সমস্ত কক্ষগুলি ডানদিকে (সেই লাইনে) বাম দিকে সরানো হয়; যেমন কোনও ফাইলের ফাঁকা রেখার ফলস্বরূপ, বা এটি সংক্ষিপ্ত হচ্ছে ... :(
পিটার.ও

1
@ ম্যাসি, সংশোধন করা হয়েছে
গ্লেন জ্যাকম্যান

-n আরএইচইএল তে কাজ করে না। বিকল্প আছে?
কোশুর

আমি শেষ পর্যন্ত মন্তব্য করতে পারি, তাই নোট করতে চাই যে আমি এর আগে নীচে একটি উত্তর যুক্ত করেছি যা পিটারকে সম্বোধন করে O
টেকনো

11

আপনি হ্যান্ডি ড্যান্ডি prকমান্ডটি সন্ধান করছেন:

paste file1 file2 | pr -t -e24

"-E24" হ'ল "ট্যাব স্টপগুলি 24 স্পেসে বিস্তৃত করুন"। ভাগ্যক্রমে, pasteকলামগুলির মধ্যে একটি ট্যাব-অক্ষর রাখে, তাই prএটি প্রসারিত করতে পারে। "পুনরাবৃত্তিমূলকভাবে গণনাযোগ্য" এবং 2 টি যোগ করে আমি 24 টি চয়ন করেছি।


ধন্যবাদ! "বিস্তৃত ট্যাবটি 24 স্পেসে থামায়" এর অর্থ কী?
টিম

আমি এমন একটি উদাহরণ দিয়েও আপডেট করি যেখানে আপনার পদ্ধতিটি সামান্য বিভ্রান্তি ব্যতীত প্রায় নখ করে।
টিম

8তিহ্যগতভাবে "ট্যাবস্টপগুলি" প্রতি 8 টি স্পেসে হিট। "123TABabc" লাইনটির শুরু থেকে 'একটি' অক্ষর 8 অক্ষর-প্রস্থের সাথে মুদ্রিত হবে। 24 এ সেট করা লাইনটির শুরু থেকে 24 অক্ষরে 'এ' লাগবে a
ব্রুস এডিগার

আপনি বলতে "-e24" "প্রসারিত ট্যাব 24 স্থানগুলি যাদের কাছে স্টপ" হয় , তবে কেন ব্যবহার করবেন expandসরাসরি কমান্ড প্রয়োগ করুন: paste file1 file2 | expand -t 24?
হোয়াইটউইন্টারওয়াল্ফ

1
@ মসি - আমার উত্তরটি অনুরূপ তবে কম জটিল যা নীচে @ টেকনোর উত্তর রয়েছে। এটি sedচালিত হয় না তাই একটি প্রক্রিয়া চলমান না যে। এটি prইউনিক্স সিএসভি দিনের সাথে মিলিত একটি প্রাচীন কমান্ড যা ব্যবহার করে , আমি মনে করি, এটি এর চেয়ে বেশি ইনস্টলগুলিতে থাকতে পারে expand। সংক্ষেপে, এটি কেবল পুরানো স্কুল।
ব্রুস এডিগার

9

আপডেট : ট্যাবুলেটেড আউটপুটটির জন্য এখানে অনেকগুলি সহজ স্ক্রিপ্ট (প্রশ্নের শেষে যেটি রয়েছে) ia আপনি যেমনটি চান ঠিক তেমন ফাইল নামটি এতে পাস করুন paste... এটি htmlফ্রেমটি তৈরি করতে ব্যবহৃত হয়, তাই এটি টুইঙ্কযোগ্য। এটি একাধিক স্পেস সংরক্ষণ করে এবং যখন ইউনিকোড অক্ষরগুলির মুখোমুখি হয় তখন কলামের সারিবদ্ধতা সংরক্ষণ করা হয়। তবে সম্পাদক বা দর্শক যেভাবে ইউনিকোড সরবরাহ করে তা সম্পূর্ণ অন্য বিষয় ...

┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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এটি ওয়ান-লাইনার হিসাবে সুস্পষ্ট সেরা দ্রাবক .. এটি আপনি আপনার ডিলিমিটার বা আপনার ফাইলগুলির একটি এসসিআইআই-আর্ট ট্যাব্লুয়েশন চান, অন্যথায় পড়ুন, অন্যথায় .. columnsএটি খুব সুন্দর সুন্দর:) ...


এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা ফাইলগুলির কোনও সংখ্যক পরিমাণ নেয় এবং একটি ASCII-art ট্যাবুলেটেড উপস্থাপনা তৈরি করে .. (মনে রাখবেন যে ইউনিকোড প্রত্যাশিত প্রস্থে রেন্ডার করতে পারে না, যেমন ௵ যা একটি একক অক্ষর This এটি কলামের থেকে একেবারেই আলাদা সংখ্যাগুলি ভুল হচ্ছে, যেমন উপরে উল্লিখিত কয়েকটি ইউটিলিটিগুলির ক্ষেত্রে)) ... স্ক্রিপ্টটির আউটপুট, নীচে দেখানো হয়েছে, F1 F2 F3 F4 নামক 4 ইনপুট ফাইল থেকে ...

+------------------------+-------------------+-------------------+--------------+
| 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}')

আপনার যদি BSD কলামের ইউটিলিটি থাকে তবে আপনি কলামের প্রস্থ নির্ধারণ করতে এবং একসাথে ট্যাবগুলি প্রসারিত করতে এটি ব্যবহার করতে পারেন। ( একটি আক্ষরিক ট্যাব অক্ষর; ব্যাশ / ksh / zsh এর অধীনে আপনি $'\t'পরিবর্তে ব্যবহার করতে পারেন , এবং যে কোনও শেল আপনি ব্যবহার করতে পারেন "$(printf '\t')"))

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

আমার সংস্করণে wcকমান্ডটি হওয়া দরকার: wc -L <left.txt... কারণ যখন কোনও ফাইলের নাম কমান্ড লাইন আর্গ হিসাবে প্রসারিত হয় , তখন এর নামটি
স্টাডআউট হয়

4

এটি বহু-পদক্ষেপ, সুতরাং এটি অপ-অনুকূল নয়, তবে এখানে চলে goes

1) দীর্ঘতম লাইনের দৈর্ঘ্যটি সন্ধান করুন file1.txt

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

আপনার উদাহরণ সহ, দীর্ঘতম লাইন 22 টি।

2) প্যাড করতে বিশুদ্ধ ব্যবহার করুন file1.txt, প্রতি লাইনের 22 টির কম অক্ষরের সাথে printfস্টেটমেন্ট সহ প্যাড করুন ।

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

দ্রষ্টব্য: এফএস এর জন্য, একটি স্ট্রিং ব্যবহার করুন যা বিদ্যমান নেই file1.txt

3) পেস্টটি আপনি আগের মতো ব্যবহার করুন।

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

আপনি যদি প্রায়শই এটি করেন তবে সহজেই এটি কোনও স্ক্রিপ্টে রূপান্তরিত হতে পারে।


সবচেয়ে দীর্ঘতম লাইনটি খুঁজে পেতে আপনার কোডে আপনার প্রয়োজন while IFS= read -r line, অন্যথায় শেলটি সাদা অংশ এবং ব্যাকস্ল্যাশগুলিকে ম্যাঙ্গেল করবে। তবে শেলটি সেই কাজের জন্য সেরা সরঞ্জাম নয়; গনুহ 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ইউনিক্স / লিনাক্স, বিশেষত বিএসডি (এবং ম্যাক ওএস এক্স) বনাম জিএনইউ / লিনাক্সের স্বাদ এবং সংস্করণগুলি জুড়ে বাস্তবায়নের ক্ষেত্রে পৃথক পৃথক বলে মনে হয়।


সেই সিড কমান্ডটি কিছুই করতে পারে না। আমি কলাম কমান্ডটি এর সাথে প্রতিস্থাপন করেছি od -cএবং আমি কোনও নাল বাইট দেখতে পাচ্ছি না। এটি সেন্টো এবং উবুন্টুতে।
গ্লেন জ্যাকম্যান

1
এটি আমার জন্য রেডহ্যাট ইএল 4 এ কাজ করেছিল। সেড এবং কলাম উভয়ই সময় এবং সিস্টেমের সাথে পরিবর্তিত হয়। উবুন্টুতে 14.4 ব্যবহার করে সেড \0হিসাবে কাজ করেনি null, তবে \x0করেছে। তবে, তারপরে কলাম একটি line too longত্রুটি দিয়েছে gave সহজ জিনিসটি মনে হয় কোনও স্থান ব্যবহার করা এবং অতিরিক্ত চরিত্রের সাথে বেঁচে থাকা।
টেকনো

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এই ইলকের অনেক স্ক্রিপ্টের মতো, উপরেরগুলি প্রথমে পড়বে 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পদ্ধতির উন্নতি করার চেষ্টা করা মজাদার হবে।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.