GNU/Linux >> Znalost Linux >  >> Ubuntu

Je možné pomocí Gedit nebo příkazového řádku upravit každý čtvrtý řádek textového souboru?

Snažím se převést textový soubor na tabulku oddělenou kartami. Můj textový soubor je něco takového:

Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana

Díky standardním funkcím vyhledávání a nahrazování v Gedit nebo LibreOffice je snadné nahradit konec řádku tabulátorem. Ale když jen vyměním návraty vozíků za karty, dostanu toto:

Dog   Cat   Fish   Lizard   Wolf   Lion   Shark   Gecko   Coyote   Puma   Eel   Iguana

Ale musím to udělat, aby to vypadalo takto:

Dog   Cat   Fish   Lizard
Wolf   Lion   Shark   Gecko  
Coyote   Puma   Eel   Iguana

Mohu tedy zaměnit každý znak konce řádku za tabulátor kromě za každý čtvrtý řádek?

Nevím, jestli lze tento druh podmíněné iterace provést s regulárními výrazy v programu, jako je Gedit nebo LibreOffice, takže to možná musí být nějaká funkce příkazového řádku? Není mi ani jasné, jaký je nejlepší nástroj pro začátek.

Aktualizace:

Zkoušel jsem následující příkazy:

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 když se pokusím otevřít výsledný tsv v LibreOffice, sloupce nejsou úplně v pořádku. Nejsem si jistý, jestli to znamená, že výše uvedené příkazy neprovádím správně, nebo jestli dělám něco špatně ve funkci importu LibreOffice:

Jen pro informaci, požadovaný výsledek by měl vypadat takto:

Přijatá odpověď:

Mohli byste použijte editor příkazového řádku, jako je sed

sed 'N;N;N;s/\n/\t/g' file > file.tsv

nebo programověji přidáním zpětného lomítka znaků pro pokračování řádku ke každému z řádků, ke kterým se chcete připojit, pomocí n skip m GNU sed adresního operátora a následuje ho klasickou jednořádkovou linkou pro spojování pokračujících řádků:

sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'

Viz například Sed One-Liners Explained :

  1. Připojte řádek k dalšímu, pokud končí zpětným lomítkem „\“.

    sed -e :a -e '/\\$/N; s/\\\n//; ta'
    

Nicméně IMHO by to bylo jednodušší s jedním z dalších standardních nástrojů pro zpracování textu, např.

paste - - - - < file > file.tsv

(číslo - bude odpovídat počtu sloupců) nebo

pr -aT -s$'\t' -4 file > file.tsv

(můžete vynechat -s$'\t pokud vám nevadí, že výstup bude oddělen více kartami).

Podivné chování při opětovném importu, které pozorujete, je téměř jistě způsobeno tím, že původní soubor má zakončení řádků CRLF ve stylu Windows. Pokud potřebujete pracovat se soubory z Windows, můžete převod převést do příkazu různými způsoby, např.

tr -d '\r' < file.csv | paste - - - -

nebo

sed 'N;N;N;s/\r\n/\t/g' file.csv

První z nich odstraní VŠECHNY návraty vozíku, zatímco druhý zachová CR na konci každého z nových řádků (což může být to, co chcete, pokud je zamýšlený koncový uživatel ve Windows).

Související:Grafický tablet Wacom Cth-480 / Ctl-480 nebyl detekován v Ubuntu 13.10 v Ubuntu?
Ubuntu
  1. Seřadit pomocí řazení na příkazovém řádku

  2. spuštění příkazu proti každému řádku v textovém souboru

  3. Stáhněte si soubor na Ubuntu pomocí příkazového řádku v systému Ubuntu 20.04

  1. Nahradit text více souborů textem Sed?

  2. Vytvářejte soubory pomocí příkazového řádku v Linuxu

  3. CentOS / RHEL 7 :Jak upravit příkazový řádek jádra

  1. Zkopírujte a vložte na příkazový řádek Linuxu pomocí xclip

  2. Manipulace s textem na příkazovém řádku pomocí sed

  3. Multi-tasking na příkazovém řádku s screenie