Să Încercăm să pună în Aplicare sed comanda
Să considerăm un exemplu de fișier CSV cu următorul conținut:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Pentru a elimina 1 câmp sau coloană :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Această expresie regulată căutări pentru o secvență de non-virgulă([^,]*) caractere și le șterge ceea ce duce la 1 domeniul obtinerea eliminat.
- Pentru a imprima numai ultimul câmp, SAU de a elimina toate câmpurile, cu excepția ultimului domeniu:
$ sed 's/.*,//' file
11
2
3
4
5
Acest regex elimină totul până la ultima virgulă(.*,) ceea ce duce la ștergerea toate domeniile, cu excepția ultimul câmp.
- Pentru a imprima doar 1 domeniu:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Acest regex(,.*) elimină caractere începând de la 1 virgulă până la sfârșitul rezultă în ștergerea toate domeniile, cu excepția ultimului câmp.
- Pentru a șterge a 2-a domeniul:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
Regex (,[^,]*,) căutări pentru o virgulă și secvență de caractere urmat de o virgulă, care rezultă în potrivire a 2-a coloana, și înlocuiește acest model asortat cu doar o virgulă, în cele din urmă se încheie în ștergerea 2-a coloană.
Notă: Pentru a șterge câmpurile din mijloc devine mai dure în sed deoarece fiecare câmp trebuie să fie adaptate la propriu.
- Pentru a imprima numai a 2-a domeniul:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
Regex meciuri primul câmp, câmpul al doilea, iar restul, cu toate acestea, grupuri de 2 domeniul singur. Întreaga linie este acum înlocuit cu al 2-lea domeniu(\1), prin urmare, doar al 2-lea câmp se afișează.
- Imprimați numai linii în care ultima coloană este un singur număr în cifre:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Regex (,[0-9]$) verifică o singură cifră în ultimul câmp și p comanda printuri de linie care se potrivește cu această condiție.
- Să număr toate liniile din fișier:
$ 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
Aceasta este o simulare de pisica-n comandă. awk face cu ușurință folosind variabilă special NR. A '=' comanda sed dă numărul de linie din fiecare linie, urmată de linia în sine. Sed ieșire este adus la un alt sed comandă să se alăture fiecare 2 linii.
- Înlocuiți ultimul câmp de 99 dacă 1 domeniu este 'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Acest regex meciuri 'Ubuntu' și până la sfârșit, cu excepția ultima coloană și grupuri de fiecare dintre ei. În piesa de schimb, 1 și 2 grup împreună cu noul număr de 99 este înlocuit.
- Ștergeți al 2-lea câmp dacă 1 domeniu este 'RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
1 domeniul de RedHat', al 2-lea domeniu și câmpurile rămase sunt grupate, iar înlocuirea se face cu doar 1 iar ultimul grup , resuting în obținerea a 2-a domeniul șterse.
- Pentru a insera o nouă coloană la final(ultima coloană) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
Regex (.*) meciuri întreaga linie și înlocuirea acesteia cu linia în sine (&) și noul domeniu.
- Pentru a insera o nouă coloană la început(1 coloana):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
La fel ca ultima exemplu, doar linie de potrivire este urmată de o nouă coloană
Sper acest lucru vă va ajuta. Lasă-mă să știu dacă aveți nevoie pentru a utiliza Awk sau orice alta comanda.
Multumesc
sed -Ei "$rownum s/$newvalue/$col" file.csv
și ea a aruncat o eroare, dar Ar dori să știu mai multe despre asta. Orice resursă pentru a citi printr-ar fi de ajutor.