awk: Split Column, печать левой стороны разделителя и вставьте в середине CSV

Прежде всего вы можете проверить ~ / .xsession -errors для любых ошибок в i3wm. В вашем случае, вероятно, он будет такой:

/bin/sh: 1: lock: not found

Это означает, что вы определили свой псевдоним в файле конфигурации, который не был получен при запуске экземпляра i3wm.

Здесь вы можете переместить свою команду псевдонима в отдельный сценарий и изменить конфигурацию на:

bindsym Ctrl+l exec /full_path_to_script/lock
2
31.08.2018, 14:46
5 ответов
$ awk -F, -v OFS=, '{ for (i=1; i<=NF; ++i) if (split($i, a, ":") > 1) $i = a[1] OFS $i } 1' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

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

Если вы знаете, что это всегда будет второе поле:

$ awk -F, -v OFS=, '{ split($2, a, ":"); $2 = a[1] OFS $2 } 1' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

В вашем коде nбудет количеством строк, на которые были разбиты данные, поэтому a[n]будет последней (самой правой):-строкой с разделителями в $2.


Использованиеsed:

$ sed 's/\([^,: ]*\):/\1, &/g' file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

Это заменит любую строку, не содержащую ,, :или пробел,и за ними сразу же следует :с самим собой дважды (во второй раз с окончательным :включенным ).

Удалите gв конце команды s, если вы собираетесь сделать только одну замену (, как в вашем примере ).

0
27.01.2020, 22:08

Попробуйте это:

awk -F, '{n=split($2,a,":"); a[n]} {$2=a[1]","$2}1' OFS=, file
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH

Ваше назначение последнего поля и второго поля для $2($2=$NF","$2)вместо назначения первого разделения в aсо вторым полем($2=a[1]","$2)

0
27.01.2020, 22:08

Простой не -awk-подход

$ ( cut -f1 -d: file ; cut -f2- -d, file ) | paste -sd,
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH
$
0
27.01.2020, 22:08

С одинарнымawk:

awk -F'[:,]' '{$3=$2":"$3}1' OFS=, infile
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH
2
27.01.2020, 22:08

Быстрый sedвариант

sed -r 's/, \w+/&&/'

Выражение \w+соответствует буквенно-цифровому (в вашем примере BBB), но не знакам препинания или пробелам. &представляет полное совпадение.

Пример

echo 'AAA, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH' | sed -r 's/, \w+/&&/'
AAA, BBB, BBB:XXX, CCC, DDD, EEE, FFF, GGG, HHH
0
27.01.2020, 22:08

Теги

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