C'è un modo per utilizzare bash per rimuovere le ultime quattro colonne per alcuni file CSV di input? Le ultime quattro colonne possono avere campi di lunghezza variabile da linea a linea, quindi non è sufficiente cancellare solo un certo numero di caratteri dalla fine di ogni riga.metodo bash per rimuovere le ultime 4 colonne dal file csv
risposta
Taglia può farlo se tutte le linee hanno lo stesso numero di campi o awk se non lo fai.
cut -d, -f1-6 # assuming 10 fields
stamperà i primi 6 campi, se si desidera controllare l'utilizzo di uscita seperater --output-delimitatore = stringa
awk -F , -v OFS=, '{ for (i=1;i<=NF-4;i++){ printf $i, }; printf "\n"}'
Loops su campi fino a th numero di campi -4 e stampe fuori.
È possibile utilizzare cut
per questo se si conosce il numero di colonne. Ad esempio, se il file ha 9 colonne, e la virgola è il vostro delimitatore:
cut -d',' -f -5
Tuttavia, questo assume i dati nel file CSV non contiene virgole. cut
interpreterà le virgole anche all'interno delle virgolette come delimitatori.
awk one-liner:
awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}' file.csv
il vantaggio di utilizzare awk sopra taglio è, non c'è bisogno di contare quante colonne avete e quante colonne si desidera conservare. Dal momento che quello che vuoi è rimuovere le ultime 4 colonne.
vedere il test:
kent$ seq 40|xargs -n10|sed 's/ /, /g'
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
21, 22, 23, 24, 25, 26, 27, 28, 29, 30
31, 32, 33, 34, 35, 36, 37, 38, 39, 40
kent$ seq 40|xargs -n10|sed 's/ /, /g' |awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}'
1, 2, 3, 4, 5, 6
11, 12, 13, 14, 15, 16
21, 22, 23, 24, 25, 26
31, 32, 33, 34, 35, 36
Questo potrebbe funzionare per voi (GNU sed):
sed -r 's/(,[^,]*){4}$//' file
Nel mio senso, è la migliore risposta qui! –
cat data.csv | rev | cut -d, -f-5 | rev
rev
inverte le linee, in modo che non importa se tutte le righe avere lo stesso numero di colonne, rimuoverà sempre l'ultimo 4. Funziona solo se le ultime 4 colonne non contengono le virgole stesse.
Questa è una soluzione davvero bella a mio avviso, +1 per l'uso di rev (non sapevo che esistesse) – skd
Questa soluzione awk in modo compromessi
awk -F, 'OFS=","{for(i=NF; i>=NF-4; --i) {$i=""}}{gsub(",,,,,","",$0);print $0}' temp.txt
awk -F, '{NF-=4; OFS=","; print}' file.csv
oppure
awk -F, -vOFS=, '{NF-=4;print}' file.csv
cadrà ultime 4 colonne da ogni riga.
Un buon modo per rilasciare le colonne extra, ma per me questo sostituisce le virgole tra le colonne con gli spazi nell'output . C'è un modo semplice per evitarlo e tenerli come virgole? –
È possibile aggiungere nuovamente il delimitatore con awk -F, '{NF- = 4; OFS = ""; print} ' –
Ottimo, funziona per me. Inoltre, è possibile impostare 'OFS' in un blocco' BEGIN' o con l'argomento '-v' della riga di comando come' awk -F, -vOFS =, ... ' –
- 1. Bash: ordina il file csv con le prime 4 colonne
- 2. CSV Python: rimuovere le virgolette dal valore
- 3. Bash edit file e mantieni le ultime 500 righe
- 4. script Bash per rimuovere principali spazi bianchi dal file nomi
- 5. Rimuovere le estensioni dal nome file
- 6. bash: estrarre le ultime due dir per un percorso
- 7. leggendo le ultime n righe dal file in c/C++
- 8. d3.js filtro dal file csv utilizzando più colonne
- 9. Come ottenere le dimensioni CSV dal terminale
- 10. come tagliare le colonne di csv
- 11. Trova le prime 4 parole e le ultime 4 parole del database dopo determinate parole chiave?
- 12. Python CSV legge il file e seleziona le colonne e scrive nel nuovo file CSV
- 13. Leggi colonne specifiche da un file csv con modulo csv?
- 14. Batch per rimuovere le righe duplicate dal file di testo
- 15. rimuovere la riga esatta conosciuta nell'enorme csv
- 16. rimuovere dal file
- 17. bash colore tee rimuovere
- 18. rimuovere le doppie estensioni in bash
- 19. Ottenere le ultime 2 directory di un percorso file
- 20. Jackson CSV colonne mancanti
- 21. Come aggiungere dati per colonne nel file csv usando R?
- 22. Usa Python per scrivere su colonne specifiche nel file csv
- 23. convertire un file a larghezza fissa dal testo in csv
- 24. Popolare database Android dal file CSV?
- 25. MySQL importa dati CSV - ignora alcune colonne csv
- 26. Utilizzando awk per "rimuovere" il testo indesiderati da file CSV
- 27. Lettura caratteri unicode dal file csv
- 28. Bash script/comando per rimuovere in massa "@ 2x" dal nome file (immagine retina -> normale)
- 29. Selezione casuale dal file CSV in Jmeter
- 30. Rails 4: Come eliminare o rimuovere (unire) le tabelle delle tabelle dal database?
nella riga di awk, suppongo che tu voglia printf $ non stampare $ i, giusto? errore di battitura forse? e 'print $ i,' non funzionerà, potresti voler avere ';' un altro errore di battitura? – Kent
@kent yeah significava printf $ i, non è necessario avere il; se solo un comando. – peteches
hai ragione, ma hai "virgola" .. :) – Kent