Spróbujmy zrealizować polecenie sed
Rozważmy przykład pliku CSV z następującą zawartością:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Aby usunąć 1-e pola lub kolumny :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
To wyrażenie regularne wyszukuje ciąg znaków bez przecinka([^,]*) i usuwa je, co prowadzi do usunięcia 1-go pola.
- Aby wydrukować tylko ostatniego pola LUB usunąć wszystkie pola, z wyjątkiem ostatniego pola:
$ sed 's/.*,//' file
11
2
3
4
5
To wyrażenie regularne usuwa wszystko, aż do ostatniej przecinkami (.*,), co powoduje usunięcie wszystkich pól z wyjątkiem ostatniego pola.
- Do druku tylko 1-go pola:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
To wyrażenie regularne(,.*) usuwa znaki od 1 przecinku do końca, w wyniku czego zostaną usunięte wszystkie pola, z wyjątkiem ostatniego pola.
- Aby usunąć 2-e pole:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
Wyrażenie regularne (,[^,]*,) wyszukuje się przecinkiem i sekwencji znaków, po których następuje przecinek, co prowadzi do wystąpienia z 2-m kolumną, i zastępuje ten szablon jest odpowiedni tylko przecinkiem, ostatecznie kończy się usunięciem 2-giej kolumny.
Uwaga: Usuwanie pól w środku staje się bardziej skomplikowana w sed, tak jak każde pole musi być powiązana dosłownie.
- Aby wydrukować tylko 2-go pola:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
Wyrażenie regularne jest zgodny z pierwszego pola, drugiego pola i innym, jednak grupuje tylko 2-e pole. Cały wiersz jest teraz zastąpiony 2-m polem(\1), więc pojawia się tylko 2-e pole.
- Należy używać tylko wiersze, w których ostatnia kolumna jest cyfra:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Wyrażenie regularne (,[0-9]$) sprawdza jednej cyfry w ostatnim polu, i zespół p wyświetla wiersz spełniający ten warunek.
- Aby ponumerować wszystkie wiersze w pliku:
$ 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
To imitacja polecenia cat-n. awk sprawia, że jest łatwo, za pomocą specjalnej zmiennej NR. Zespół " = " sed określa numer wiersza każdego wiersza, po którym następuje sama linia. Dane wyjściowe sed przekazywane są przekazywane w potoku w inne polecenie sed do połączenia się co 2 wiersze.
- Wymień ostatnie pole na 99, jeśli 1 - e pole - "Ubuntu".:
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
To wyrażenie regularne odpowiada "Ubuntu" i do końca, za wyjątkiem ostatniej kolumny, a także grupuje każdy z nich. W części przeznaczonej do wymiany są zastępowane 1-i 2 grupy wraz z nowym numerem 99.
- Usuń 2-e pole, jeśli 1-e pole "RedHat":
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
1. pole "RedHat", 2-e pole, a pozostałe pola są pogrupowane i wymiana odbywa się tylko 1 i ostatniej grupy , co prowadzi do usunięcia 2-go pola.
- Aby wstawić nową kolumnę w końcu(ostatnia kolumna) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
Wyrażenie regularne (.*) odpowiada całej linii i zastępuje ją najniższej ciągiem znaków (&) i nowym polem.
- Aby wstawić nową kolumnę na początek(1 - sza kolumna):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Podobnie jak w poprzednim przykładzie, tylko za co zbiega się wierszem należy nową kolumnę
Mam nadzieję, że to pomoże. Daj mi znać, jeśli potrzebujesz użyć Awk lub jakąkolwiek inną drużynę.
Dziękuję
sed -Ei "$rownum s/$newvalue/$col" file.csv
i to spowodowało błąd, ale chciałbym dowiedzieć się o tym więcej. Również byłby przydatny dowolny zasób do czytania.