Удалить строки, когда в столбце 28 нет данных, используя bash (awk / sed) - PullRequest
0 голосов
/ 23 июня 2019

Ниже приведен краткий пример того, как выглядят мои файлы .csv:

"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","","N"

В третьем столбце (столбец «Z») у меня отсутствуют ячейки (строки 3, 6 и 9). С помощью awk или sed желательно, чтобы я специально указывал на столбец 3, и если какая-либо из ячеек пуста, я хотел бы удалить всю строку. Мой конечный результат будет:

"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"

Для моего реального проекта ниже приведена точная копия одного из моих файлов - https://github.com/drphillgood/riotapidata/blob/master/csv/game3.csv. В столбце 28 (участники __participantId) вы увидите, что только некоторые ячейки содержат данные (то же самое для последнего столбца, участники __playerName). Если одна из ячеек в этом столбце пуста, я хочу удалить всю строку, используя скрипт .sh. Конечный файл будет выглядеть так: https://github.com/drphillgood/riotapidata/blob/master/csv/game3_v2.csv

Ответы [ 4 ]

3 голосов
/ 23 июня 2019

Более простая команда AWK:

awk -F , '$3 != "\"\"" {print}' inputfile > outputfile

Установите разделитель полей на запятую и напечатайте каждую строку с третьим полем, состоящим только из "".

Это недостаточно надежно для обработки файлов CSV, которые содержат запятые в полях. Ожидается, что пустое поле будет состоять из пустых кавычек.

1 голос
/ 23 июня 2019
awk -F, '$3 ~ /"Z"/{print $0}' file

"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
1 голос
/ 23 июня 2019

Это можно сделать с помощью команды sed: sed -r -n '/^([^,]*,){27}""/! p' yourfile

Используйте 27 для полного файла или 2 для минимального примера, чтобы указать количество полей перед в столбце, который необходимо проверить.

Регулярное выражение печатает (p вместе с опцией -n) строки, которые не (/.../! восклицательный знак отрицает), соответствуют условию:

  • ^ совпадение с начала строки,
  • ([^,]*,)[27} 27 полей, разделенных запятой, которые могут выродиться до 27 запятых,
  • "" только двойные кавычки в следующем поле
1 голос
/ 23 июня 2019

Вот скрипт awk, который делает трюк.

awk -F '","' '!$3{next}1' input.csv

вывод:

"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"
"X","Y","Z","N"

объяснение:

BEGIN {FS = "\",\""}  # input line field separator ","
!$3{next}             # if empty string in 3rd input field, skip
1                     # print current line

Обновление:

Ниже приведены комментарии и предоставлен тестовый файл CSV в ссылке.

Тестирование для поля $ 28

Вывод для awk -F '","' '!$28{next}1' input.txt | awk -F '","' '{print $28}'

participants__participantId
1
2
3
4
5
6
7
8
9
10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...