GNU/Linux >> Linux Esercitazione >  >> Ubuntu

È possibile con Gedit o la riga di comando modificare ogni quarta riga di un file di testo?

Sto cercando di convertire un file di testo in un foglio di calcolo separato da tabulazioni. Il mio file di testo è qualcosa del genere:

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

Con le funzioni standard di ricerca e sostituzione in Gedit o LibreOffice, è facile sostituire la fine della riga con una scheda. Ma se cambio solo i ritorni a capo con le schede, otterrò questo:

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

Ma quello che devo fare è farlo sembrare così:

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

Quindi, posso scambiare ogni carattere di fine riga con una scheda tranne per ogni quarta riga?

Non so se questo tipo di iterazione condizionale può essere eseguita con espressioni regolari all'interno di un programma come Gedit o LibreOffice, quindi forse questa deve essere una sorta di funzione della riga di comando? Non sono nemmeno chiaro quale sia lo strumento migliore per iniziare.

Aggiornamento:

Ho provato i seguenti comandi:

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

Ma quando provo ad aprire il risultante tsv file in LibreOffice, le colonne non sono del tutto corrette. Non sono sicuro se questo significa che non sto eseguendo correttamente i comandi precedenti o se sto facendo qualcosa di sbagliato nella funzione di importazione di LibreOffice:

Solo per riferimento, il risultato desiderato dovrebbe assomigliare a questo:

Risposta accettata:

Potresti usa un editor a riga di comando come sed

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

o, in modo più programmatico, aggiungendo una barra rovesciata caratteri di continuazione di riga a ciascuna delle linee a cui vuoi unirti usando n skip m di GNU sed operatore di indirizzo e a seguire con il classico one-liner per l'unione di linee continue:

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

Vedi ad esempio Sed One-Liners Explained :

  1. Aggiungi una riga alla successiva se termina con una barra rovesciata “\”.

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

Tuttavia, IMHO sarebbe più semplice con una delle altre utilità di elaborazione del testo standard, ad esempio

paste - - - - < file > file.tsv

(il numero di - corrisponderà al numero di colonne) o

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

(puoi omettere il -s$'\t se non ti dispiace che l'output sia separato da più schede).

Lo strano comportamento di reimportazione che stai osservando è quasi certamente dovuto al fatto che il file originale ha terminazioni di riga CRLF in stile Windows. Se devi lavorare con file da Windows, puoi eseguire la conversione nel comando in vari modi, ad es.

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

o

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

Il primo rimuoverà TUTTI i ritorni a capo mentre il secondo manterrà un CR alla fine di ciascuna delle nuove righe (che potrebbe essere ciò che desideri se l'utente finale previsto è su Windows).

Correlati:Tavoletta grafica Wacom Cth-480 / Ctl-480 non rilevata in Ubuntu 13.10 in Ubuntu?
Ubuntu
  1. Copia e incolla nella riga di comando di Linux con xclip

  2. Multitasking alla riga di comando con screenie

  3. eseguendo un comando su ogni riga in un file di testo

  4. Scarica un file su Ubuntu utilizzando la riga di comando sul sistema Ubuntu 20.04

  5. Crea file utilizzando la riga di comando in Linux

Come scaricare un file su Ubuntu usando la riga di comando

Manipolazione del testo dalla riga di comando con grep

Tracciare il tempo con Timewarrior alla riga di comando

Come scaricare un file su Ubuntu Linux usando la riga di comando

Visualizza il contenuto di un file nella riga di comando di Linux

Il comando Cat non mostra le righe del testo?