Повторяющиеся строки в соответствии с атрибутом столбца - PullRequest
0 голосов
/ 15 мая 2018

Используя csv-файл, мне нужно сгенерировать файл, подобный желаемому выводу, цель состоит в том, чтобы использовать столбец 3 (дубликаты столбцов 1 и 2 в соответствии с временами в столбце 3). пример

39823,39828:38466-38896/2(1-216)
39840:38466-38896/2(217-432)
39852:38466-38896/2(433-648)

в столбце 3 - 3 раза (...), для столбцов 1 и 2 - 3 раза.

Здесь входной файл

21,39823,39828:38466-38896/2(1-216) 39840:38466-38896/2(217-432) 39852:38466-38896/2(433-648),0
22,39827,39828:38466-38896/2(1-216) 39840:38466-38896/2(217-432) 39852:38466-38896/2(433-648) 39864:38466-38896/2(649-864),0
23,39825,39828:38466-38896/2(1-216) 39840:38466-38896/2(217-432) 39852:38466-38896/2(433-648), 39852:38000-90000/2(433-648)
24,39827,39828:38466-39196/2(1-366) 39840:38466-39196/2(367-732) 39852:38466-39196/2(733-1098),0

Требуется вывод

21  39823   39828:38466-38896/2(1-216)
21  39823   39840:38466-38896/2(217-432)
21  39823   39852:38466-38896/2(433-648)
22  39827   39828:38466-38896/2(1-216)
22  39827   39840:38466-38896/2(217-432)
22  39827   39852:38466-38896/2(433-648)
22  39827   39864:38466-38896/2(649-864)
23  39825   39828:38466-38896/2(1-216)
23  39825   39840:38466-38896/2(217-432)
23  39825   39852:38466-38896/2(433-648)
**23  39825   39852:38000-90000/2(433-648)**
24  39827   39828:38466-39196/2(1-366)
24  39827   39840:38466-39196/2(367-732)
24  39827   39852:38466-39196/2(733-1098)

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Не могли бы вы попробовать awk и сообщить мне, поможет ли это вам.

awk -v s1="**" -F' |,' '{nf=$NF==0||!$NF?NF-1:NF;for(i=3;i<=nf;i++){if($i){match($i,/\(.*\)/);val=substr($i,RSTART,RLENGTH);printf("%s%s",++a[val]>3? s1 $1 OFS $2 OFS $i s1:$1 OFS $2 OFS $i,ORS)}}}'  Input_file

Теперь добавляется также форма решения с одним вкладышем.

awk -v s1="**" -F' |,' '
{
  nf=$NF==0||!$NF?NF-1:NF;
  for(i=3;i<=nf;i++){
     if($i){
       match($i,/\(.*\)/);
       val=substr($i,RSTART,RLENGTH);
       printf("%s%s",++a[val]>3? s1 $1 OFS $2 OFS $i s1:$1 OFS $2 OFS $i,ORS)
     }
  }
}'   Input_file
0 голосов
/ 15 мая 2018

Awk решение:

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

Выход:

21  39823   39828:38466-38896/2(1-216)
21  39823   39840:38466-38896/2(217-432)
21  39823   39852:38466-38896/2(433-648)
22  39827   39828:38466-38896/2(1-216)
22  39827   39840:38466-38896/2(217-432)
22  39827   39852:38466-38896/2(433-648)
22  39827   39864:38466-38896/2(649-864)
23  39825   39828:38466-38896/2(1-216)
23  39825   39840:38466-38896/2(217-432)
23  39825   39852:38466-38896/2(433-648)
24  39827   39828:38466-39196/2(1-366)
24  39827   39840:38466-39196/2(367-732)
24  39827   39852:38466-39196/2(733-1098)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...