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 awk
bleiben 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 sed
Schritt 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,
Teilen Sie die Eingabe in alphabetische und numerische Einträge auf, indem Sie Folgendes verwenden
grep
:grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
Fügen Sie die beiden resultierenden Dateien zusammen
alpha
unddigit
verwenden Siepaste
:paste alpha digit
(Sie können hinzufügen-d " "
, dass ein Leerzeichen statt eines Tabulators verwendet wird)