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 :
-
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?