ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Понедельник, 31 марта, 2025
Сегодня у нас 1 праздник:
Международный День Резервного Копирования (World Backup Day). Пользователи сайта социальных новостей reddit предложили сделать дату 31.03 Международным днём резервного копирования, аргументируя это тем, что никогда заранее нельзя узнать, какие сюрпризы преподнесёт 1.04

Чтение CSV-файла в Bash

Чтение CSV-файла в Bash

Полная форма CSV — значение, разделенное запятыми. Файл CSV используется кодировщиком для многих целей, которые хранят данные в табличном формате полуструктур. Каждая строка файла обрабатывается как строка таблицы, и каждое поле строки отделяется запятой (,) в файле CSV. В Bash существует множество способов чтения файлов CSV, которые объясняются в этом руководстве.

 

Предпосылки:

Вы должны создать файл CSV, прежде чем практиковать пример этого руководства. Создайте файл CSV с именем «customers.csv» со следующим содержимым, чтобы проверить выходные данные сценария, используемого в этой статье. В этом файле 3 поля 4 строки и 6-й строки пусты.

ID, имя, электронная почта, адрес, мобильный
101, Andrey Master, Andrey@yandex.ru, 9/A Krasnaya, +89621762341425
102, Alex Murphy, Alex@yandex.ru, 120 Mira, +89621988675345
103, Dimon Avackov,,33/2 Ochakovo, +89621754532312
104, Anna Dimidova, Anna@yandex.ru, 10 Severnaya, +89621512875634
105, Anton Pupkov,, 2/B Krasnaya, +89621700453423

 

Различные способы чтения файла CSV в Bash

Файл CSV можно анализировать различными способами с помощью сценария Bash. В этой части статьи показаны различные способы чтения файла «customers.csv».

 

Пример 1. Чтение исходного содержимого CSV-файла

Создайте файл Bash со следующим скриптом, который считывает полное содержимое файла «customers.csv» с помощью цикла while:

#!/bin/bash
# установить filename
filename="customers.csv"
#Считывайте каждую строку файла на каждой итерации
while read data
do
#Распечатать линию
echo $data
done < $filename

 

После выполнения скрипта появляется следующий вывод:

andreyex@andreyex:$ bash readcsv1.bash
ID, имя, электронная почта, адрес, мобильный
101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425
102, Alex Murphy, Alex@yandex.ru , 
120 Mira, +89621988675345 
103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312 
104, Anna Dimidova , Anna@yandex.ru , 10 Severnaya, +89621512875634 
105, Anton Pupkov, 2/B Krasnaya, +89621700453423 
andreyex@andreyex:-$

 

Пример 2. Чтение CSV-файла с использованием заглавных букв в заголовке

Первая строка файла «customers.csv» содержит заголовок файла. Создайте файл Bash со следующим сценарием, который печатает содержимое файла «customers.csv» после заглавной буквы в первой строке файла. Команда awk используется в скрипте для печати содержимого файла после написания заголовка с заглавной буквы. Запятая (,) назначается в значениях FS и OFS в сценарии для чтения файла «customers.csv» и записи файла «updatedcustomers.csv». Команда cat используется для печати содержимого обоих файлов.

printf "Оригинал файла:\n"
#Распечатайте исходное содержимое CSV-файла
cat cstomers.csv
#Создайте новый CSV-файл после ввода заголовка с заглавной буквы
awk 'BEGIN{FS=",";OFS=","}
{
if(NR==1)
print toupper($0)
else
print
}' customers.csv > updatedcustomers.csv
printf "\nModified File:\n"
#Распечатайте новый CSV-файл
cat updatedcustomers.csv

 

После выполнения скрипта появляется следующий вывод:

andreyex@andreyex:-$ bash readcsv2.bash
Оригинальный файл:
ID, имя, электронная почта, адрес, мобильный
101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425
102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345 103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312
104, Anna Dimidova , Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov, , 2/B Krasnaya, +89621700453423
Modified File:
ID, NAME, EMAIL, ADDRESS, MOBILE
101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345
103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312
104, Anna Dimidova , f Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov, , 2/B Krasnaya, +89621700453423 andreyex@andreyex:-$

Пример 3. Замените пустое поле CSV-файла на «No».

Создайте файл Bash со следующим сценарием, который печатает содержимое файла «customers.csv» после изменения пустого поля со значением «No». В этом файле пусты два поля, о которых говорится ниже. Команда «awk» используется в сценарии для печати содержимого файла после изменения пустых полей. Запятая (,) назначается в значениях FS и OFS в сценарии для чтения файла «customers.csv» и записи файла «updatedcustomers.csv». Команда «cat» используется для печати содержимого обоих файлов в табличном формате.

printf "Оригинал файла:\n"
#Распечатайте исходное содержимое CSV-файла в табличной форме
cat customers.csv | column -s, -t
awk 'BEGIN{FS=",";OFS=","}
{
for(field=1;field<=NF;field++)
{
if($field == "") $field="None"
}
print
}' customers.csv > modifiedcustomers2.csv
printf "\nИзмененный файл:\n"
#Распечатайте новый CSV-файл в табличной форме
cat modifiedcustomers2.csv | column -s, -t

 

После выполнения скрипта появляется следующий вывод:

andreyex@andreyex: -$ bash readcsv3.bash
Оригинальный файл:
ID
Name
101 Andrey Master
102 Alex Murphy
Email
Andrey@yandex.ru Alex@yandex.ru
Address
9/A Krasnaya
120 Mira
Mobile +89621762341425 +89621988675345
103 Dimon Avackov 104 Anna Dimidova 105 Anton Pupkov
33/2 Ochakovo
Anna@yandex.ru 10 Severnaya
2/B Krasnaya
+89621754532312
+89621512875634
+89621700453423
Modified File:
ID Name 
101 Andrey Master 
102 Alex Murphy
104 Anna Dimidova 
105 Anton Pupkov
Email
103 Dimon Avackov None
Andrey@yandex.ru Alex@yandex.ru
Anna@yandex.ru None
Address
9/A Krasnaya
120 Mira
33/2 Ochakovo
10 Severnaya
2/B Krasnaya
Mobile
+89621762341425 +89621988675345 +89621754532312 +89621512875634 +89621700453423
andreyex@andreyex: -$

 

Пример 4. Распечатайте общее количество строк и столбцов CSV-файла

Создайте файл Bash со следующим сценарием, который подсчитывает общее количество строк и столбцов в файле «customers.csv». Переменная NR используется для печати общего количества строк файла. Переменная NF используется для печати общего количества полей файла.

printf "Оригинал файла:\n"
#Распечатайте исходное содержимое CSV-файла
cat customers.csv
echo
echo -n "Общее количество строк:"
awk -F, 'END{print NR}' customers.csv
echo -n "Общее количество столбцов:"
awk -F, 'END{print NF}' customers.csv

 

Следующий вывод появляется после выполнения скрипта. Всего строк в файле 6, а всего полей файла 5, которые выводятся на выходе:

andreyex@andreyex:-$ bash readcsv4.bash
Оригинальный файл:
ID, имя, электронная почта, адрес, мобильный
101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425
102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345
103, Dimon Avackov,33/2 Ochakovo, +89621754532312
104, Anna Dimidova, Anna@yandex.ru , 10 Severnaya, +89621512875634 
105, Anton Pupkov,, 2/B Krasnaya, +89621700453423
Общее количество строк:6
Общее количество столбцов:5
andreyex@andreyex:-$

 

Заключение

В этой статье показаны методы чтения CSV-файла, изменения CSV-файла и подсчета строк и столбцов CSV-файла с помощью сценария Bash.

Exit mobile version