পাশাপাশি দুটি ফাইল প্রদর্শন করুন


95

কিভাবে 2 টি পৃথক লেন্থ পাঁচমিশালী পাঠ্য ফাইল প্রদর্শন পাশাপাশি হতে পারে (কলামে) একটিshell

দেওয়া one.txtএবং two.txt:

$ cat one.txt
apple
pear
longer line than the last two
last line

$ cat two.txt
The quick brown fox..
foo
bar 
linux

skipped a line

প্রদর্শন:

apple                               The quick brown fox..
pear                                foo
longer line than the last two       bar 
last line                           linux

                                    skipped a line

paste one.txt two.txtপ্রায় কৌতুকটি করে তবে কলামগুলি সুন্দরভাবে বিন্যস্ত করে না কারণ এটি কলাম 1 এবং 2 এর মধ্যে একটি ট্যাব প্রিন্ট করে আমি জানি কিভাবে এটি ইমাস এবং ভিআইএম দিয়ে করা যায় তবে পাইপ ইসিটির জন্য আউটপুট প্রদর্শিত হবে।

সমাধানটি আমি ব্যবহারগুলি sdiffএবং তারপরে পাইপগুলিকে আউটপুট অ্যাড করতে সরানোর জন্য নিয়ে এসেছি sdiff

sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'

আমি একটি ফাংশন তৈরি করতে এবং এটি আমার কাছে আটকে রাখতে পারি .bashrcতবে অবশ্যই এর জন্য একটি আদেশ ইতিমধ্যে বিদ্যমান (অথবা সম্ভাব্য কোনও ক্লিনার সমাধান)?


একটি শেল নয়, তবে উল্লেখযোগ্য: মেল্ড ব্যবহার করুন !
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

উত্তর:


167

আপনি এটি করতে ব্যবহার করতে পারেন pr, -mফাইলগুলি একীকরণের জন্য পতাকাটি ব্যবহার করে প্রতি কলামে একটি করে এবং -tশিরোনাম বাদ দিতে যেমন।

pr -m -t one.txt two.txt

ফলাফল:

apple                               The quick brown fox..
pear                                foo
longer line than the last two       bar
last line                           linux

                                    skipped a line

আরো দেখুন:


15
পারফেক্ট! জানতেন যে কোনও কিছুর অস্তিত্ব থাকবে, এর prআগে কখনও শুনিনি । আমি 3 টি ফাইল দিয়ে চেষ্টা করেছি এবং আউটপুট কেটে গেছে তবে -wবিকল্পটি এটি সমাধান করেছে। চমৎকার উত্তর.
ক্রিস সিমোর

4
@ সুডো_ও: সাহায্য করতে পেরে খুশি,
কোরিউটিলস

4
পর্দার প্রস্থ স্বয়ংক্রিয়ভাবে সনাক্ত করার জন্য কি কোনও উপায় আছে?
ম্যাট

4
@ ম্যাট: আপনি ব্যবহার করতে পারেন $COLUMNS, যা শেল দ্বারা সরবরাহ করা উচিত।
হস্তুরকুন

4
পাশাপাশি দুটি ফাইল মুদ্রণ করার সময় pr, দীর্ঘ লাইনের প্রান্তটি কেটে দেয়। লাইনগুলি মোড়ানো করার কোনও উপায় আছে?
মোলনারগ

32

@ হস্তুরকুনের উত্তরে কিছুটা প্রসারিত করতে : ডিফল্টরূপে prতার আউটপুটটির জন্য কেবল 72২ টি কলাম ব্যবহার করে, তবে এটি আপনার টার্মিনাল উইন্ডোর সমস্ত উপলব্ধ কলামগুলি ব্যবহার করা তুলনামূলকভাবে সহজ:

pr -w $COLUMNS -m -t one.txt two.txt

বেশিরভাগ শেলগুলি আপনার টার্মিনালের স্ক্রিনউইথটি পরিবেশের ভেরিয়েবলের মধ্যে সঞ্চয় করবে (এবং আপডেট করবে)$COLUMNS , সুতরাং আমরা কেবলমাত্র prতার মানটিকে এর আউটপুটটির প্রস্থের সেটিংসের জন্য ব্যবহার করতে যাচ্ছি ।

এটি @ ম্যাট এর প্রশ্নেরও উত্তর দেয় :

পর্দার প্রস্থ স্বয়ংক্রিয়ভাবে সনাক্ত করার জন্য কি কোনও উপায় আছে?

সুতরাং, না: prনিজেই স্ক্রিনউইথটি সনাক্ত করতে পারে না, তবে আমরা -wবিকল্পটির মাধ্যমে টার্মিনালের প্রস্থে গিয়ে কিছুটা সহায়তা করছি ।


7

আপনি কি জানেন ইনপুট ফাইল তারপর ব্যবহার করে, কোনো ট্যাব আছে expandসরলীকৃত @oyss এর উত্তর :

paste one.txt two.txt | expand --tabs=50

যদি ইনপুট ফাইলগুলিতে ট্যাব থাকতে পারে তবে আপনি সর্বদা প্রথমে প্রসারিত করতে পারেন:

paste <(expand one.txt) <(expand two.txt) | expand --tabs=50

6
paste one.txt two.txt | awk -F'\t' '{
    if (length($1)>max1) {max1=length($1)};
    col1[NR] = $1; col2[NR] = $2 }
    END {for (i = 1; i<=NR; i++) {printf ("%-*s     %s\n", max1, col1[i], col2[i])}
}'

*একটি ফর্ম্যাট স্পেসিফিকেশন ব্যবহার আপনাকে ক্ষেত্রের দৈর্ঘ্য গতিশীল সরবরাহ করতে দেয়।


4
এটি কখনও করেনি বলেছিল না, তবে আমি যদি মাঝে মাঝে দুটি ফাইল পাশাপাশি দেখাতে চাই তবে তার সাথে প্রদর্শিত আলাদা আলাদা অতিরিক্ত অক্ষরগুলির diff -y one.txt two.txtতুলনায় আরও ভাল কাজ করা কোনও স্ক্রিপ্ট লেখার / স্মরণ করার সাথে তুলনা করা তুচ্ছ । এমনকি উভয়ই দীর্ঘস্থায়ীভাবে ফাংশন হিসাবে ! = আরও ভাল, আরও পঠনযোগ্য, দ্রুত .. এখানে সুবিধা কী? paste one.txt two.txtsedawk.bash_rc
ক্রিস সেমোর

2

বার্মারের উত্তর থেকে গতিশীল ক্ষেত্রের দৈর্ঘ্য গণনা এটিকে আরও সংক্ষিপ্ত কমান্ড তৈরি করবে .... তবে আপনার কাজটি শেষ করার জন্য আপনার এখনও কমপক্ষে একটি স্ক্রিপ্টের প্রয়োজন যা আপনি কোন পদ্ধতি চয়ন না করে এড়ানো যায় না।

paste one.txt two.txt |awk -F'\t' '{printf("%-50s %s\n",$1,$2)}'

2

আপনি পাশাপাশি দুটি ফাইলের মধ্যে প্রকৃত পার্থক্যটি জানতে চান, ব্যবহার করুন diff -y :

diff -y file1.cf file2.cf

আপনি ব্যবহার করে একটি আউটপুট প্রস্থ সেট করতে পারেন -W, --width=NUMবিকল্পটি :

diff -y -W 150 file1.cf file2.cf

এবং diffএর কলাম আউটপুট আপনার বর্তমান টার্মিনাল উইন্ডো ফিট করে:

diff -y -W $COLUMNS file1.cf file2.cf

2

একটি sedউপায় আছে:

f1width=$(wc -L <one.txt)
f1blank="$(printf "%${f1width}s" "")"
paste one.txt two.txt |
    sed "
        s/^\(.*\)\t/\1$f1blank\t/;
        s/^\(.\{$f1width\}\) *\t/\1 /;
    "

অধীনে , আপনি ব্যবহার করতে পারেন printf -v:

f1width=$(wc -L <one.txt)
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
    sed "s/^\(.*\)\t/\1$f1blank\t/;
         s/^\(.\{$f1width\}\) *\t/\1 /;"

(অবশ্যই @Hasturkun এর সমাধান prহয় সবচেয়ে সঠিক !) :

sedওভার সুবিধাpr

আপনি বিচ্ছিন্নতা প্রস্থ এবং বিভাজক সূক্ষ্মভাবে চয়ন করতে পারেন:

f1width=$(wc -L <one.txt)
(( f1width += 4 ))         # Adding 4 spaces
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
    sed "s/^\(.*\)\t/\1$f1blank\t/;
         s/^\(.\{$f1width\}\) *\t/\1 /;"

অথবা, নমুনার জন্য, ধারণকারী লাইনগুলি চিহ্নিত করতে line:

f1width=$(wc -L <one.txt)
printf -v f1blank "%${f1width}s"
paste one.txt two.txt |
    sed "s/^\(.*\)\t/\1$f1blank\t/;
  /line/{s/^\(.\{$f1width\}\) *\t/\1 |ln| /;ba};
         s/^\(.\{$f1width\}\) *\t/\1 |  | /;:a"

রেন্ডার করবে:

apple                         |  | The quick brown fox..
pear                          |  | foo
longer line than the last two |ln| bar 
last line                     |ln| linux
                              |  | 
                              |ln| skipped a line

1

অজগর ভিত্তিক সমাধানের নীচে সন্ধান করুন।

import sys

# Specify the number of spaces between the columns
S = 4

# Read the first file
l0 = open( sys.argv[1] ).read().split('\n')

# Read the second file
l1 = open( sys.argv[2] ).read().split('\n')

# Find the length of the longest line of the first file
n = len(max(l0, key=len))

# Print the lines
for i in  xrange( max( len(l0), len(l1) ) ):

    try:
        print l0[i] + ' '*( n - len(l0[i]) + S) + l1[i]
    except:
        try:
            print ' ' + ' '*( n - 1 + S) + l1[i]
        except:
            print l0[i]

উদাহরণ

apple                            The quick brown fox..
pear                             foo
longer line than the last two    bar 
last line                        linux

                                 skipped a line

0
diff -y <file1> <file2>


[root /]# cat /one.txt
আপেল
নাশপাতি
শেষ দুটি চেয়ে দীর্ঘ লাইন
শেষ লাইন
[root /]# cat /two.txt
দ্রুত বাদামী শিয়াল ..
ফু
বার
লিনাক্স
[root@RHEL6-64 /]# diff -y one.txt two.txt
আপেল | দ্রুত বাদামী শিয়াল ..
নাশপাতি | ফু
শেষ দুটি চেয়ে দীর্ঘ লাইন | বার
শেষ লাইন | লিনাক্স

sdiffহয় diff -yযা আমি প্রশ্নে আলোচনা।
ক্রিস সেমোর

হ্যাঁ ঠিক ... এটি করার জন্য আরও একটি কমান্ড / পতাকা সেটিংস দেখানোর জন্য উল্লেখ করা হয়েছিল।
আইধ্যায়ান

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