Skip to content
Na tej stronie

Przykładowe operacje na prostych danych w środowisku uniksowym

Poniżej przedstawiliśmy przykładowe zadania wraz z rozwiązaniami, z którymi może spotkać się użytkownik terminala podczas pracy z plikami CSV.

Czym jest plik CSV

Plikiem CSV nazywamy plik tekstowy, zawierający dane ułożone w formie tabelarycznej.

Kolejne kolumny zazwyczaj odzielone są znakiem ;. Spotyka się również znak tabulatora (\t) albo przecinek (,).

txt
ID;Nazwa Dystrybucji;Twórcy;Rok pierwszego wydania;Bazuje na;Strona internetowa
1;Debian;Debian Project;1993;;https://debian.org/
2;Ubuntu;Canonical Inc.;2004;Debian;https://ubuntu.com/
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/
6;Fedora;Fedora Project;2003;;https://getfedora.org/
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
ID;Nazwa Dystrybucji;Twórcy;Rok pierwszego wydania;Bazuje na;Strona internetowa
1;Debian;Debian Project;1993;;https://debian.org/
2;Ubuntu;Canonical Inc.;2004;Debian;https://ubuntu.com/
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/
6;Fedora;Fedora Project;2003;;https://getfedora.org/
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/

Dla poniższych zadań przyjmujemy powyższy przykład danych CSV.

Zakładamy, że do poniższych komend zostały przekazane dane CSV na wejściu (cat dystrybucje.csv | <komenda>).

Operacje na uproszczonych plikach CSV

Do poniższych komend należy przekazać odpowiednie wejście lub ścieżkę do pliku tekstowego. Ich wyjście można też odpowiednio przekierować (operatory |, >, <).

Część poniższych komend działa tylko w uproszczonych przypadkach. Przy plikach posiadających separatory wewnątrz danych, należy użyć narzędzia awk.

Ostrzeżenie

Jeżeli w danym pliku CSV znak separatora może pojawić się wewnątrz tekstu w kolumnie, należy użyć narzędzia awk.

Przykład takiego pliku:

txt
ID,Gatunek drzewa,Wzrost [m]
1,Klon,"14,36"
2,Dąb,"17,2"
ID,Gatunek drzewa,Wzrost [m]
1,Klon,"14,36"
2,Dąb,"17,2"

Jak wyświetlić dane CSV w sposób wyjustowany

bash
column -t -s';'
column -t -s';'
txt
ID  Nazwa Dystrybucji  Twórcy                  Rok pierwszego wydania  Bazuje na  Strona internetowa
1   Debian             Debian Project          1993                               https://debian.org/
2   Ubuntu             Canonical Inc.          2004                    Debian     https://ubuntu.com/
3   Kubuntu            Społeczność Kubuntu     2005                    Ubuntu     https://kubuntu.org/
4   Linux Mint         Społeczność Linux Mint  2006                    Ubuntu     https://linuxmint.com/
5   OpenMediaVault     Volker Theile           2011                    Debian     https://openmediavault.org/
6   Fedora             Fedora Project          2003                               https://getfedora.org/
7   Elementary OS      elementary, Inc.        2011                    Ubuntu     https://elementary.io/
ID  Nazwa Dystrybucji  Twórcy                  Rok pierwszego wydania  Bazuje na  Strona internetowa
1   Debian             Debian Project          1993                               https://debian.org/
2   Ubuntu             Canonical Inc.          2004                    Debian     https://ubuntu.com/
3   Kubuntu            Społeczność Kubuntu     2005                    Ubuntu     https://kubuntu.org/
4   Linux Mint         Społeczność Linux Mint  2006                    Ubuntu     https://linuxmint.com/
5   OpenMediaVault     Volker Theile           2011                    Debian     https://openmediavault.org/
6   Fedora             Fedora Project          2003                               https://getfedora.org/
7   Elementary OS      elementary, Inc.        2011                    Ubuntu     https://elementary.io/

Jak wyświetlić nagłówek z pliku CSV

bash
head -n 1
head -n 1
txt
ID;Nazwa Dystrybucji;Twórcy;Rok pierwszego wydania;Bazuje na;Strona internetowa
ID;Nazwa Dystrybucji;Twórcy;Rok pierwszego wydania;Bazuje na;Strona internetowa

Jak wyświetlić dane CSV bez nagłówka

bash
tail -n +2
tail -n +2
txt
1;Debian;Debian Project;1993;;https://debian.org/
2;Ubuntu;Canonical Inc.;2004;Debian;https://ubuntu.com/
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/
6;Fedora;Fedora Project;2003;;https://getfedora.org/
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
1;Debian;Debian Project;1993;;https://debian.org/
2;Ubuntu;Canonical Inc.;2004;Debian;https://ubuntu.com/
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/
6;Fedora;Fedora Project;2003;;https://getfedora.org/
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/

Jak wyświetlić dane CSV o określonych wartościach kolumn

Kolumna ID równa 3

bash
grep -E '^3;'
grep -E '^3;'
txt
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/
3;Kubuntu;Społeczność Kubuntu;2005;Ubuntu;https://kubuntu.org/

Dystrybucje których pierwsze wydanie nastąpiło dawniej niż 2000 rok włącznie

bash
grep -E '^([^;]*;){3}(1[0-9]{3}|2000)'
grep -E '^([^;]*;){3}(1[0-9]{3}|2000)'
txt
1;Debian;Debian Project;1993;;https://debian.org/
1;Debian;Debian Project;1993;;https://debian.org/

Linie zawierające pustą kolumnę

bash
grep ';;'
grep ';;'
txt
1;Debian;Debian Project;1993;;https://debian.org/
5;Fedora;Fedora Project;2003;;https://getfedora.org/
1;Debian;Debian Project;1993;;https://debian.org/
5;Fedora;Fedora Project;2003;;https://getfedora.org/

Wyświetl rok pierwszego wydania dystrybucji Ubuntu

bash
cut -d';' -f 2,4 | grep -E '^Ubuntu;' | cut -d';' -f2
cut -d';' -f 2,4 | grep -E '^Ubuntu;' | cut -d';' -f2
txt
2004
2004

Utwórz zestawienie bazowanych dystrybucji. Posortuj malejąco według ilości wystąpień

bash
tail -n +2 | cut -d';' -f 5 | sort | uniq -c | grep -o -E '[0-9]+ .+$' | sort | tac
tail -n +2 | cut -d';' -f 5 | sort | uniq -c | grep -o -E '[0-9]+ .+$' | sort | tac
txt
3 Ubuntu
2 Debian
3 Ubuntu
2 Debian

Jak posortować dane CSV

Posortuj dane według ID na początku linii malejąco. Wynik ogranicz do trzech pierwszych linii

bash
tail -n +2 | sort -n | tac | head -n 3
tail -n +2 | sort -n | tac | head -n 3
txt
6;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
5;Fedora;Fedora Project;2003;;https://getfedora.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/
6;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
5;Fedora;Fedora Project;2003;;https://getfedora.org/
4;Linux Mint;Społeczność Linux Mint;2006;Ubuntu;https://linuxmint.com/

Wyświetl dane dwóch najnowszych dystrybucji w kolejności alfabetycznej od jej nazwy

Posortujemy dane według czwartej kolumny przechowującej rok pierwszego wydania, a jeżeli się powtarzają, według drugiej kolumny zawierającej nazwę. Wynik ograniczymy do dwóch linii.

bash
tail -n +2 | sort -t';' -k4,4 -k2,2 | tail -n 2
tail -n +2 | sort -t';' -k4,4 -k2,2 | tail -n 2
txt
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/
7;Elementary OS;elementary, Inc.;2011;Ubuntu;https://elementary.io/
5;OpenMediaVault;Volker Theile;2011;Debian;https://openmediavault.org/