Próbuję przekonwertować plik tekstowy na arkusz kalkulacyjny oddzielony tabulatorami. Mój plik tekstowy wygląda mniej więcej tak:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Dzięki standardowym funkcjom wyszukiwania i zamiany w Gedit lub LibreOffice łatwo zastąpić koniec linii tabulatorem. Ale jeśli po prostu zamienię zwrot karetki na tabulatory, otrzymam to:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Ale muszę to zrobić tak:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Czy mogę zamienić każdy znak końca linii na tabulator oprócz każdej czwartej linii?
Nie wiem, czy tego rodzaju warunkową iterację można wykonać za pomocą wyrażeń regularnych w programie takim jak Gedit lub LibreOffice, więc może to musi być jakaś funkcja wiersza poleceń? Nie jestem nawet pewien, jakie jest najlepsze narzędzie na początek.
Aktualizacja:
Próbowałem następujących poleceń:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Ale kiedy próbuję otworzyć wynikowy tsv
plik w LibreOffice, kolumny nie są w porządku. Nie jestem pewien, czy to oznacza, że nie wykonuję poprawnie powyższych poleceń, czy też robię coś złego w funkcji importu LibreOffice:
Dla porównania pożądany wynik powinien wyglądać następująco:
źródło
dos2unix
iunix2dos
.Możesz użyć,
xargs
aby zawsze zgrupować cztery linie w jeden, oddzielone pojedynczą spacją:-d '\n'
ustawia ogranicznik wejściowy na znak nowego wiersza, w przeciwnym razie łamałby się również na spacjach. Jeśli i tak masz tylko jedno słowo w wierszu wprowadzania, możesz nawet to pominąć.-n4
ustawia liczbę argumentów (liczbę elementów wejściowych na linię wyjściową) na 4.Wynik:
Lub jeśli chcesz tabulatory jako separatory zamiast spacji, możesz je później wymienić. Jeśli jednak w wierszach wejściowych byłyby spacje, zostaną one również zastąpione:
Dane wyjściowe (wygląd w zależności od szerokości zakładki przeglądarki / terminala):
źródło
Możesz również użyć:
Dwie wbudowane zmienne awk to:
ORS
: O utput R ecord S eparator (domyślnie = nowy wiersz). Jest dodawany na końcu każdego polecenia drukowania.NR
: N umbra obecnego R ow awk przetwarzania.To polecenie wyświetli dla każdej linii zawartość pierwszej (i tylko tutaj) kolumny. Następnie wybiera dodanie nowego wiersza lub karty, testując pozostałą część podziału
NR
przez 4.źródło
Kolejne najkrótsze
awk
podejście:Ten printf tylko jedną kolumnę, a następnie przez następne i następne i ... i zakładkę
\t
znak po sobie, ale printf do\n
charakteru ewline gdy N umbra z R ECORD był czynnikiem 4 (gdzieNR%4
zwróci 0 (fałsz), który jest co Ternary Operatorcondition(s)?when-true:when-false
to robi.)źródło
Moim rozwiązaniem byłoby użycie kombinacji
sed
ised
. Po pierwsze, co czwarty wiersz można oznaczyć znakiem specjalnym, na przykład>
za pomocą tego rozwiązania:W takim przypadku chcesz zacząć od linii 5 i zaznaczać co 4 linię po niej. W GNU
sed
można to podać jako adres5~4
. Możesz użyć tego polecenia:Następnie musisz usunąć nowe linie, co można zrobić za pomocą
sed
pętli:Są łatwiejsze sposoby konwersji znaków nowej linii na inny znak, na przykład za pomocą
tr
:Tak czy inaczej, połączenie tych dwóch daje
(
sed
wersja pozostawia końcowy znak nowej linii, atr
wersja nie)Następnie wystarczy przekonwertować wstawione znaki specjalne na znaki nowej linii; patrz na przykład Konwertuj plik rozdzielany tabulatorami, aby używać znaków nowej linii . W takim przypadku zmień
>
na nowe linie:y
Polecenie wykonuje tę samą funkcję, cotr
, przekształcając jednego znaku do drugiego, ale można użyćs
komendy tutaj równie dobrze. Za pomocąs
musiszg
operować każdym dopasowaniem w linii (sed 's/>/\n/g'
).Zamiast tworzyć dwa pliki pośrednie, możesz użyć potoków:
Jeśli końcowe spacje stanowią problem, możesz dodać kolejne polecenie, aby je usunąć:
źródło
Dla "kompletności" oto czyste rozwiązanie bash:
Działa również ze spacjami, przy założeniu, że
IFS
jest poprawnie ustawiony (który powinien domyślnie AFAIK). Co więcej, myślę, że może to być nawet przenośny skrypt powłoki i działać z dowolną powłoką kompatybilną z POSIX.źródło
$'
'
POSIX nie wymaga formy cytowania. Na przykład wdash
(którysh
domyślnie zapewnia w Ubuntu), uruchamianieprintf '%s\n' $'a\tb'
tylko wyjść$a\tb
. To nie znaczy, że to nie jest przydatne; to działa w trybie bash. Jednak, podobnie jak w przypadku niektórych innych rozwiązań opublikowanych przez ludzi, produkuje niepełne dane wyjściowe, jeśli liczba wierszy danych wejściowych nie jest wielokrotnością czterech. Polecam również użycieread -r
, ponieważ nie ma powodu, aby sądzić, że pożądane jest tutaj rozwinięcie ukośników odwrotnych w pliku wejściowym.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Makro vim (zapisane za pomocą q) może zastosować operację, a następnie pominąć trzy linie. Następnie wystarczy uruchomić to makro n razy.
na przykład:
źródło
Ponieważ poprosiłeś o rozwiązanie Gedit, coś takiego powinno działać:
Odnaleźć:
Zamienić:
Upewnij się, że pole wyboru dla wyrażeń regularnych jest zaznaczone.
Jak to działa:
Pierwszym krokiem jest znalezienie serii znaków słownych za pomocą \ w + i przechwycenie wyników w zmiennej \ 1 przez zawinięcie nawiasów wokół wyrażenia:
Następnie szukamy serii znaków kończących wiersze, \ r i \ n, lub CR i LF. Ponieważ pliki sformatowane w systemie Windows używają obu, tworzymy klasę znaków, zawijając te dwa znaki w nawiasach kwadratowych. Plus powoduje, że wyszukuje jeden lub więcej znaków:
Na koniec powtarzamy to jeszcze 3 razy, przechowując każde kolejne słowo w zmiennych \ 2, \ 3 i \ 4. To sprawia, że zastąpienie wyrażeniem jest proste. Musimy po prostu umieścić znaki tabulacji, \ t oraz nowy znak wiersza, \ n, w odpowiednich miejscach dla potrzebnego formatowania.
źródło