শেলতে অঙ্কিত রেখার সাথে বর্ণমালার রেখার পাঠটি কীভাবে মার্জ করবেন?


10

আমার কাছে একটি ফাইল রয়েছে যা এর মতো পাঠ্য রয়েছে:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

ইত্যাদি ...

এবং আমি সংখ্যার লাইনের সাথে বর্ণমালার লাইনগুলি মিলাতে চাই যাতে তারা এর মতো হয়:

AAAA 1234 
BBBB 5678
CCCC 9012
DDDD 3456

EEEE 7890

কেউ কি এটি অর্জনের একটি সহজ উপায় সম্পর্কে জানেন?


আপনি উল্লেখ করেছেন emacs.. আপনি কি কোনও elispসমাধান খুঁজছেন , বা কীভাবে ইমাসের মধ্যে থেকে শেল-স্ক্রিপ্ট চালাবেন?
পিটার.ও

উত্তর:


3

একটি উপায় ব্যবহার perl:

এর বিষয়বস্তু script.pl:

use warnings;
use strict;

## Check arguments.
die qq[Usage: perl $0 <input-file>\n] unless @ARGV == 1;

my (@alpha, @digit);

while ( <> ) {
        ## Omit blank lines.
        next if m/\A\s*\Z/;

        ## Remove leading and trailing spaces.
        s/\A\s*//;
        s/\s*\Z//;

        ## Save alphanumeric fields and fields with
        ## only digits to different arrays.
        if ( m/\A[[:alpha:]]+\Z/ ) {
                push @alpha, $_;
        }
        elsif ( m/\A[[:digit:]]+\Z/ ) {
                push @digit, $_;
        }
}

## Get same positions from both arrays and print them
## in the same line.
for my $i ( 0 .. $#alpha ) {
        printf qq[%s %s\n], $alpha[ $i ], $digit[ $i ];
}

এর বিষয়বস্তু infile:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

এটি চালান:

perl script.pl infile

এবং ফলাফল:

AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890

জবর ... আপনার দুই Regex প্রতিকল্পন লাইন যা সরান সামনের এবং পিছনের শূন্যস্থানগুলি দ্রুত একটি একক লাইন যা backreferencing এবং অ লোভী ব্যবহার করছে তার চেয়ে 1.6 গুণ সম্পর্কে সঞ্চালন করুন: s/\A\s*(.*?)\s*\Z/\1/
পিটার.ও

4

ইন awk, খালি লাইন সংরক্ষণের ভাল ফরম্যাট করা ফাইল অভিমানী কিন্তু লজিক ফাইলটি পরীক্ষা যোগ করা যেতে পারে:

awk -v RS="" '{for(i=1; i<=NF; i++) a[i]=$i
  getline
  for(i=1; i<=NF; i++) print a[i] " " $i
  print ""}' file

4
<input sed -nr '/^[A-Z]{4}$/,/^$/w out1
                /^[0-9]{4}$/,/^$/w out2'
paste -d' ' out1 out2 |sed 's/^ $//' 

বা, একক পদক্ষেপে, অস্থায়ী ফাইল ছাড়াই

paste -d' ' <(sed -nr '/^[A-Z]{4}$/,/^$/p' input) \
            <(sed -nr '/^[0-9]{4}$/,/^$/p' input) | sed 's/^ $//' 

শেষ sedপদক্ষেপটি ফাঁকা রেখায় ডিলিমিটার সরিয়ে দেয়, যা দ্বারা প্রবর্তিত paste...


3

ইমাক্স সহ পাঠ্য লাইনগুলি কাটাতে অঙ্কের ক্রিয়াকলাপগুলি ব্যবহার করুন এবং সংখ্যার লাইনের আগে তাদের আটকে দিন।


ধন্যবাদ, তবে 15000+ লাইনের জন্য সত্যিই উপযুক্ত নয়! একটি কার্যকারী ধারণার জন্য +1 এবং আপনার রেপ দরকার :)
এনডাব্লুএস

2

যদি এন্ট্রিগুলি যথাযথ হয়,

  1. বর্ণনামূলক এন্ট্রি এবং সংখ্যাযুক্ত এন্ট্রিগুলিতে ইনপুটটি বিভক্ত করুন grep:

    • grep "[[:alpha:]]\+" < file > alpha
    • grep "[[:digit:]]\+" < file > digit
  2. দুই ফলে ফাইল যোগ দিন, alphaএবং digitব্যবহার paste:

    • paste alpha digit(আপনি এটি যুক্ত করতে পারেন -d " "যাতে এটি কোনও ট্যাবের পরিবর্তে একটি স্থান ব্যবহার করে)

1
টেম্প ফাইল ছাড়া: paste <(grep "[[:alpha:]]\+" file) <(grep "[[:digit:]]\+" file)বা একটি একক প্রক্রিয়া প্রতিকল্পন সঙ্গে: grep "[[:alpha:]]\+" file | paste - <(grep "[[:digit:]]\+" file)
jfg956

1

খুব খারাপ খারাপের কাছে খুব ভাল ধাক্কা / পপ / আনশিফ্ট / শিফট ফাংশন নেই। এখানে একটি ছোট পার্ল স্নিপেট

perl -M5.010 -lne '
  given ($_) {
    when (/^[[:alpha:]]+$/) {push @alpha, $_}
    when (/^\d+$/) {say shift(@alpha), " ", $_}
    default {say}
  }
'

আমি যখন এটি চালাব, এটি প্রতি গ্রুপে অতিরিক্ত (শীর্ষস্থানীয়) ফাঁকা লাইন আউটপুট দেয়।
পিটার.ও

defaultধারাটির কারণে , ফাঁকা লাইনগুলি তাত্ক্ষণিকভাবে মুদ্রিত হয়, সুতরাং "1234" এর পূর্বে ফাঁকাটি "এএএএ" লাইনের আগে প্রদর্শিত হবে।
গ্লেন জ্যাকম্যান

0

পাঠ্য সহ ফাইল দিন, ব্যবহারের চেষ্টা করুন prএবং নীচের মতো বিকল্প সিনট্যাক্স প্রক্রিয়া করুন:

$ pr -mt <(grep -i "^[a-z]" file.txt) <(grep -i "^[0-9]" file.txt)
AAAA                    1234
BBBB                    5678
CCCC                    9012
DDDD                    3456
EEEE                    7890

আপনি দ্বারা প্রস্থ সামঞ্জস্য করতে -w9বা দ্বারা ফাঁকা স্থান অপসারণ করতে পারেন sed "s/ //g"

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