शेल में संख्यात्मक लाइनों के साथ अल्फाबेटिक लाइनों के पाठ को कैसे मर्ज किया जाए?


10

मेरे पास एक फाइल है जिसमें इस तरह का टेक्स्ट है:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

आदि...

और मैं न्यूमेरिक लाइनों को न्यूमेरिक लाइनों के साथ मिलाना चाहता हूं ताकि वे इस तरह से हों:

AAAA 1234 
BBBB 5678
CCCC 9012
DDDD 3456

EEEE 7890

क्या किसी को यह हासिल करने का एक सरल तरीका पता है?


आप उल्लेख करते हैं emacs.. क्या आप एक elispसमाधान की तलाश कर रहे हैं, या emacs के भीतर से शेल-स्क्रिप्ट कैसे चलाएं?
पीटर.ओ।

विम में: एसओ पर कई लाइनों (दो ब्लॉकों) को
मिलाएं

जवाबों:


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 प्रतिस्थापन लाइनें जो प्रमुख और अनुगामी रिक्त स्थान को निकालती हैं, वे एकल पंक्ति की तुलना में लगभग 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 और आपको प्रतिनिधि की आवश्यकता है :)
NWS

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

बहुत खराब awk में अच्छा पुश / पॉप / अनशिफ्ट / शिफ्ट फ़ंक्शंस नहीं हैं। यहाँ एक छोटा सा पर्ल स्निपेट है

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

जब मैं इसे चलाता हूं, तो यह प्रति समूह एक अतिरिक्त (अग्रणी) रिक्त लाइन आउटपुट करता है।
पीटर.ओन

defaultक्लॉज के कारण , खाली लाइनें तुरंत प्रिंट हो जाती हैं, इसलिए "1234" से पहले का रिक्त "AAAA" लाइन से पहले दिखाई देगा।
ग्लेन जैकमैन

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"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.