только одна запись на группу в каждой строке - PullRequest
0 голосов
/ 24 марта 2019

Допустим, у меня есть следующий файл с именем groups.txt, содержащий:

aaa:
bbb:11,22
ccc:
ddd:44,11

Мне нужно написать команду / скрипт ksh для отображения каждой записи для каждой соответствующей группы только один раз перед строкой.Ожидаемый результат:

aaa:
bbb:11
bbb:22
ccc:
ddd:44
ddd:11

Любое предложение более чем приветствуется

Я уже пробовал:

cat group | cut -d ":" -f 1,4| tr '[a-z]' '[A-Z]' |  sed 's/:/ /g' | while read -r L11 L12
do {
 for L21 in $(echo $L12 | cut -d " " -f 1,2 | sed 's/,/ /g')
 do
  echo $L11, $L21
 done
} < /dev/null
done 

, но не работает, как ожидалось.Эта команда не отображает пустые группы

Ответы [ 3 ]

3 голосов
/ 24 марта 2019

Это простая задача для awk:

awk -F '[:,]' -v OFS=':' '{ for(i=2;i<=NF;++i) print $1, $i }' file

Пустая группа (aaa:) также разбирается на два поля;1-е - имя группы, 2-е - пустая строка.Так что пустые группы тоже печатаются.

0 голосов
/ 24 марта 2019

Вы можете попробовать с помощью sed:

cat script.sed 
:A
  s/(^[^:]*:)([^,]*),(.*)/\1\2\n\1\3/
tA

sed -E -f script.sed infile
0 голосов
/ 24 марта 2019

Не могли бы вы попробовать следующее (протестировано только с предоставленными образцами).

awk -F':' '{gsub(/,/,ORS $1 ":")} 1' Input_file

ИЛИ

awk -F':' '{gsub(/,/,ORS $1 FS)} 1'  Input_file

Вывод будет следующим.

aaa:
bbb:11
bbb:22
ccc:
ddd:44
ddd:11
...