Mam plik z kolumnami. Przykład poniżej:
a b c ... z
1 2 3 ... 26
Chciałbym zamienić wszystkie kolumny, w których pierwszy staje się ostatnim, drugi staje się przedostatnim ... itd.
z y x ... a
26 25 24 ... 1
Czy istnieje jedna wkładka ( awk
lub sed
), która to robi?
Wiem, że można użyć, awk
gdy jest tylko kilka kolumn, ale chciałbym móc to zrobić w plikach z tysiącami kolumn.
tac
robi to idealnie dla linii.
Chyba szukam odpowiednika dla kolumn.
rev
nie działało dla mnie, ponieważ zamienia również zawartość w kolumnie.
text-processing
sed
awk
columns
użytkownik22519
źródło
źródło
perl -lane 'print join " ", reverse @F'
Odpowiedzi:
źródło
Możesz to zrobić za pomocą małego skryptu python:
źródło
Jeśli nie masz nic przeciwko pythonowi, ten linijka odwróci kolejność kolumn oddzielonych spacjami w każdym wierszu:
Powyższe działa również z python2.7:
źródło
Używanie w jeden sposób
awk
.Treść
infile
:Uruchom następujące
awk
polecenie:Z następującym wynikiem:
źródło
Jest to powolne, ale ma jedną funkcję odkupienia. Utrzymuje szerokość separatorów pól, gdy są one szersze niż pojedynczy znak. FWIW: Jeśli uruchomisz ten skrypt dwa razy, wynik będzie identyczny z oryginałem.
Oto skrypt.
Oto kilka porównań czasowych. Plik testowy zawierał 1 linię.
źródło
Państwo może użyć
tac
po prostu trzeba transponować wejście przed i po. Można to zrobić za pomocą kalkulatora arkusza kalkulacyjnegosc
i jego pomocnikapsc
:Jak widać tutaj .
Działa to najlepiej, gdy wszystkie kolumny są wypełnione.
w pliku
outfile
Edytować
Jak zauważył PeterO,
sc
ma twardy limit 702 kolumn, więc jest to maksymalny rozmiar obsługiwany przez tę metodę.źródło
1
->1.00
. Ponadto dostaję błędy dla linii o szerokości większej niż 702 pola. Wydaje się, że odnosi się to do limitu liczbowego 32768 ... ale jest dość szybki, asis.-S
dopsc
polecenia powinno interpretować wszystko jako ciągi znaków. Jeśli chodzi o limit kolumn 702, jest to twardy limit, ponieważ obsługiwane są tylko kolumny od A do ZZ (26 + 26 * 26), dodam komentarz na ten temat.Ten potok jest szybszy niż najszybsza inna odpowiedź o znaczący czynnik (patrz wyniki). Wykorzystuje
tr
itac
. Musi wykorzystywać 2 bajty ASCII (\ x00- \ x7F), które nie istnieją w twoich danych.\x00
jest zwykle dobrym wyborem, ale jest w\x01
stanie użyć dowolnego bajtu ASCII, którego nie ma w danych.W tym przykładzie SPACJA i TAB jako znaki ograniczników. Ograniczniki mogą być wielobajtowe lub pojedyncze. Separator wyjściowy to pojedyncza spacja.
Oto polecenie. Nazwa pliku pokazuje
numberof fields
_xnumber of lines
Jeśli chcesz / musisz sprawdzić nieużywane bajty, możesz wcześniej sprawdzić za pomocą tego opcjonalnego
awk
skryptu. Całkowity czas, nawet przy uruchomieniu tego opcjonalnego skryptu, jest nadal znacznie szybszy niż w przypadku innych metod (jak dotąd :) .. Oto skrypt wstępnego przetwarzania.Oto skrypt awk:
char-ascii-not-in-stream
Drugi zestaw czasów dla tego skryptu obejmuje
char-ascii-not-in-stream
czas.źródło
Możesz to również zrobić bez wydruku f :
źródło