Обновить разделитель определенных столбцов

Udev позволяет реагировать на аппаратные события, в этом случае ACTIONможет быть add, remove, change.

У вас есть ACTION=="change", который срабатывает при вставке или извлечении DVD.

Попробуйте следующее правило:

KERNEL=="sr1", ACTION=="add",ENV{ID_CDROM_MEDIA_DVD}="1", ENV{ID_CDROM_MEDIA_STATE}!="blank", RUN+="/mnt/DVD/MakeMKV/trigger.sh"
0
05.05.2021, 19:56
3 ответа

Вы толком не объяснили, как мы можем узнать, какие запятые оставить, а какие заменить. Основываясь на единственной строке примера, которую вы нам дали, может быть достаточно просто заменить все ,, которые не идут после пробела, на|:

$ sed -E 's/,(\S)/\|\1/g' file
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995

Или, если вы действительно не хотите менять заголовок:

$ sed -E '2,${s/,(\S)/\|\1/g}' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995

В качестве альтернативы, если мы не можем полагаться на пробел и вместо этого должны заменить все запятые, кроме 5-й в строках, на что-то вроде этого :«если в этой строке более 7 полей, то рассмотрим 5-й ,в строке строка как часть 4-го поля, а не как разделитель». Если это так, это должно сработать для вас:

$ $ perl -F, -lane 'if($#F>6){$F[4].=",$F[5]"; splice(@F,5,1)} print join("|",@F)' file
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995

Или, опять же, если вы действительно не хотите менять заголовок, используйте:


$ perl -F, -lane 'if($#F>6){$F[4].=",$F[5]"; splice(@F,5,1)} $.==1 ? print : print join("|",@F)' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
2
28.07.2021, 11:34
$ perl -F, -lne 'if ($#F == 7) {$F[4].= ",$F[5]"; splice @F,5,1};
                 print join("|",@F);' input.csv
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995

Этот лайнер Perl One -проверяет, сколько полей, разделенных запятыми -, находится в каждой строке ввода. Если есть 8 полей, он добавляет запятую и содержимое поля 5 к полю 4, затем удаляет поле 5 с помощью splice().

Все это делается с помощью auto -split array @F, который в Perl эквивалентен $1, $2, $3 и т. д. в awk, когда perl вызывается либо с -F, либо с -a.

Затем он печатает массив @F, соединенный вертикальной чертой |, независимо от того, изменились ли поля 4 и 5 или нет.

Примечание. :Perl-массивы начинаются с нуля, а не с единицы. $#Fвозвращает последний номер индекса массива @F, поэтому тест == 7, а не == 8. В записи с 8 полями @F будет иметь индексы 0..7. Это также означает, что 5-е поле (Адрес )обозначается как $F[4], а не $F[5].

1
28.07.2021, 11:34

Использование любого awk в любой оболочке на каждом компьютере Unix:

$ awk -F, -v OFS='|' 'NF>7{$5=$5",\n"; sub(/\n./,"")} 1' file
Name,Age,Country,ID,Address,Category,DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995

$5=$5",\n"добавляет ,и новую строку (, которые иначе не могут присутствовать в текущей записи, поскольку записи разделяются символами новой строки )в конец поля 5, что в результате изменения поля заставляет awk перестроить $0, заменяя все ,между полями (, то есть все запятые в записи, кроме запятой, которую мы только что сделали частью поля 5 ), поэтому мы получаем ...|field4|field5,<newline>|field6|field7|....

Затем

sub(/\n./,"")удаляет единственный <newline>|, который может существовать в записи, то есть тот, который находится между field5,и field6, поэтому у нас остается ...|field4|field5,field6|field7|..., который является желаемым результатом.

2
28.07.2021, 11:34

Теги

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