Как проверить наличие пустых полей в CSV-файле?

Я мог исправить это, используя HEAD-0 или HEAD-1.

например. xsetwacom --set "Перо Wacom Intuos PT S 2" MapToOutput HEAD-1

2
11.11.2016, 00:29
4 ответа

Как упоминается в комментарий , простым и очевидным ответом будет grep '||' , но при этом не будут обнаружены случаи, когда первый или последний столбец имеет значение NULL.

Итак, правильный ответ (все еще использующий grep ):

grep '^|\|||\||$' file.txt

Символ | не является специальным для Grep, если он не экранирован обратной косой чертой или если - Указана опция E . Тем не менее, это немного неясно, поэтому давайте посмотрим, как бы он выглядел, если бы разделителем в файле была запятая :

grep '^,\|,,\|,$' file.txt

Если вы хотите опустить строки, где только последний ] имеет значение NULL, но выведите строки, в которых любое другое поле имеет значение NULL, просто опустите последний регистр:

grep '^|\|||' file.txt

На самом деле, легче увидеть, что происходит, если вы поместите отдельные случаи в отдельные аргументы, например:

grep -e '^|' -e '||' -e '|$' file.txt 
3
27.01.2020, 22:10

Используя Miller :

$ cat pipe.dat
apple|banana||pear||grapefruit
lemon|lime|damson|jackfruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

$ cat has-blanks.mlr
@has_empty = false;
for (k,v in $*) {
    if (v == "") {
        @has_empty = true;
        break;
    }
}
filter @has_empty;

$ cat pipe.dat | mlr --nidx --fs pipe put -f has-blanks.mlr
apple|banana||pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|
0
27.01.2020, 22:10

Это найдет нулевые поля, включая первое и последнее поле.

awk -F\| '{for(i=1;i<=NF;i++) if($i=="") { print $0; next } }' file.csv > out.txt
0
27.01.2020, 22:10

Вы можете попробовать это с помощью awk. Он выведет номер строки в случае совпадения.

$ awk  '/^\|/ || /\|\|/ || /\|$/{print $0}' input_test 
apple|banana|pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

Основываясь на ваших изменениях к первоначальному вопросу, я переработал команду awk.

Объяснение: Awk будет соответствовать одному из трех условий

  • /\|\|/ будет соответствовать любому нулевому полю, которое не является первым или последним.
  • /^\|/ будет соответствовать любому нулевому полю в начале строки - "^".
  • /\|$/ будет соответствовать любому нулевому полю в конце строки - "$".

Поскольку awk распознает | как оператор, когда мы пытаемся найти соответствие "|", мы должны использовать "\" перед ним.

Теперь эти 3 условия объединяются вместе с "||", что awk интерпретирует как "or". Когда одно из этих трех условий будет выполнено, будет напечатана вся строка.

Чтобы определить нулевой столбец (столбцы), можно использовать

awk -F"|" '!length($1) || !length($4) {print $0} ' input_test
0
27.01.2020, 22:10

Теги

Похожие вопросы