Wie kann ich in der Shell den Text alphabetischer Zeilen mit dem Text numerischer Zeilen zusammenführen?

Wie kann ich in der Shell den Text alphabetischer Zeilen mit dem Text numerischer Zeilen zusammenführen?

Ich habe eine Datei mit einem Text wie diesem:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

usw...

Und ich möchte die alphabetischen Zeilen mit den numerischen Zeilen abgleichen, sodass sie wie folgt aussehen:

AAAA 1234 
BBBB 5678
CCCC 9012
DDDD 3456

EEEE 7890

Kennt jemand eine einfache Möglichkeit, dies zu erreichen?

Antwort1

In awkbleiben leere Zeilen erhalten und man geht davon aus, dass die Datei gut formatiert ist. Es könnte jedoch eine Logik zur Überprüfung der Datei hinzugefügt werden:

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

Antwort2

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

oder in einem einzigen Schritt ohne temporäre Dateien

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

Der letzte sedSchritt entfernt das Trennzeichen in den Leerzeilen, das durch paste... eingeführt wird.

Antwort3

Eine Möglichkeit mit perl:

Inhalt von 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 ];
}

Inhalt von infile:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

Führen Sie es wie folgt aus:

perl script.pl infile

Und Ergebnis:

AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890

Antwort4

Wenn die Einträge in Ordnung sind,

  1. Teilen Sie die Eingabe in alphabetische und numerische Einträge auf, indem Sie Folgendes verwenden grep:

    • grep "[[:alpha:]]\+" < file > alpha
    • grep "[[:digit:]]\+" < file > digit
  2. Fügen Sie die beiden resultierenden Dateien zusammen alphaund digitverwenden Sie paste:

    • paste alpha digit(Sie können hinzufügen -d " ", dass ein Leerzeichen statt eines Tabulators verwendet wird)

verwandte Informationen