Mam plik z takim tekstem:
AAAA
BBBB
CCCC
DDDD
1234
5678
9012
3456
EEEE
7890
itp...
Chcę dopasować linie alfabetyczne do linii numerycznych, aby wyglądały tak:
AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
Czy ktoś zna prosty sposób na osiągnięcie tego?
emacs
... Szukaszelisp
rozwiązania lub jak uruchomić skrypt powłoki z poziomu emacsa?Odpowiedzi:
Jeden sposób przy użyciu
perl
:Treść
script.pl
:Treść
infile
:Uruchom to jak:
I wynik:
źródło
s/\A\s*(.*?)\s*\Z/\1/
.W
awk
, zachowując puste linie, zakładając, że plik jest dobrze sformatowany, ale można dodać logikę, aby sprawdzić plik:źródło
lub w jednym kroku, bez plików tymczasowych
Ostatni
sed
krok usuwa separator w pustych liniach, który wprowadzapaste
...źródło
Za pomocą emacsa użyj operacji prostokąta, aby wyciąć linie tekstu i wkleić je przed liniami numerycznymi.
źródło
Jeśli wpisy są w porządku,
Podziel dane wejściowe na pozycje alfabetyczne i numeryczne, używając
grep
:grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
Połącz dwa powstałe pliki
alpha
idigit
używającpaste
:paste alpha digit
(możesz dodać,-d " "
aby używała spacji zamiast tabulacji)źródło
paste <(grep "[[:alpha:]]\+" file) <(grep "[[:digit:]]\+" file)
albo z jednego substytucji procesowej:grep "[[:alpha:]]\+" file | paste - <(grep "[[:digit:]]\+" file)
.Szkoda, że awk nie ma ładnych funkcji push / pop / unshift / shift. Oto krótki fragment Perla
źródło
default
klauzulę puste linie są natychmiast drukowane, więc puste przed „1234” pojawią się przed linią „AAAA”.Podaj plik z tekstem, spróbuj użyć
pr
i przetworz składnię podstawień jak poniżej:Możesz dostosować szerokość o
-w9
lub usunąć spacje osed "s/ //g"
.źródło