Cerchiamo di Implementare il comando sed
Consideriamo un esempio di file CSV con il seguente contenuto:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Per rimuovere il 1 ° campo o colonna :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Questa espressione regolare la ricerca di una sequenza non la virgola([^,]*) caratteri e li elimina il cui risultato è il 1 ° campo sempre rimosso.
- Per stampare solo l'ultimo campo, O rimuovere tutti i campi ad eccezione dell'ultimo campo:
$ sed 's/.*,//' file
11
2
3
4
5
Questa espressione regolare rimuove tutto fino all'ultima virgola(.*,) che si traduce nell'eliminazione di tutti i campi, ad eccezione dell'ultimo campo.
- Per stampare solo il 1 ° campo:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Questa regex(,.*) rimuove i caratteri a partire dal 1 ° comma fino alla fine con conseguente eliminazione di tutti i campi, ad eccezione dell'ultimo campo.
- Per eliminare il 2 ° campo:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
La regex (,[^,]*,) la ricerca di una virgola e la sequenza di caratteri seguita da una virgola, che si traduce in corrispondenza del 2 ° colonna, e sostituisce questo modello abbinato con appena una virgola, in ultima analisi finale l'eliminazione di 2a colonna.
Nota: Per eliminare i campi in mezzo diventa più resistenti in sed poiché ogni campo deve essere abbinato letteralmente.
- Per stampare solo il 2 ° campo:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
La regex il primo campo, il secondo campo e il resto, per i gruppi 2 ° campo da solo. Tutta la linea è ora sostituito con il 2 ° campo(\1), quindi solo il 2 ° campo viene visualizzato.
- Stampa solo le righe in cui l'ultima colonna è un numero di cifra:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
La regex (,[0-9]$) verifica la presenza di una sola cifra nell'ultimo campo, e il comando p stampe la linea che soddisfa questa condizione.
- Per il numero di tutte le righe del file:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
Questa è la simulazione del gatto -n comando. awk non è facilmente utilizzando la variabile speciale NR. Il comando '=' della sed dà il numero di riga di ogni linea seguita dalla linea stessa. Sed uscita viene reindirizzato a un altro sed comando per unire ogni 2 righe.
- Sostituire l'ultimo campo da 99 se il 1 ° campo è 'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Questa regex 'Ubuntu' e fino alla fine, tranne l'ultima colonna e gruppi di ognuno di loro. Nella parte di ricambio, 1 ° e 2 ° gruppo con il nuovo numero 99 è sostituito.
- Eliminare il 2 ° campo se il 1 ° campo è "RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
Il 1 ° campo "RedHat", il 2 ° campo e i restanti campi sono raggruppati, e la sostituzione è fatto con solo il 1 ° e l'ultimo gruppo , resuting a ottenere il 2 ° campo eliminati.
- Per inserire una nuova colonna alla fine(ultima colonna) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
La regex (.*) le partite di tutta la linea e la sua sostituzione con la linea stessa (&) e il nuovo campo.
- Per inserire una nuova colonna di inizio(1 ° colonna):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Come la scorsa, ad esempio, la linea di corrispondenza è seguita da una nuova colonna
Spero che questo sarà di aiuto. Fatemi sapere se avete bisogno di usare Awk o qualsiasi altro comando.
Grazie
sed -Ei "$rownum s/$newvalue/$col" file.csv
e ha gettato un errore, ma Vorrei sapere di più su questo. Qualsiasi risorsa a leggere su sarebbe utile pure.