Unix awk команда для выполнения определенной логики - PullRequest
0 голосов
/ 14 марта 2019

Я не очень хорош с командами Unix и изо всех сил пытаюсь достичь этого.

У меня есть файл, как показано ниже

ВХОД

ABCDEF_XY_12345_PQRTS_67367
1,a,b,c1
2,a,b,c2
3,a,b,c3
.....
APRTEYW_XY_23456_GDJHJH_232434
1,a,b,c4
2,a,b,c5
3,a,b,c6
......
GDHGJHG_XY_35237_FHDJFH_738278
1,a,b,c7
2,a,b,c8
3,a,b,c9
......

OUTPUT

12345,1,a,b,c1
12345,2,a,b,c2
12345,3,a,b,c3
23456,1,a,b,c4
23456,2,a,b,c5
23456,3,a,b,c6
35237,1,a,b,c7
35237,2,a,b,c8
35237,3,a,b,c9

По сути, взятие подстроки между _XY_[<STRING>]_ и добавление их к следующим строкам, таким как <STRING>,1,a,b,c1, пока мы не встретим шаблон совпадения строк _XY_[<STRING>]_, а затем повторим тот же процесс до EOF.

Я пытаюсь найти простой способ сделать это, используя awk или разделив мастер-файл на несколько меньших файлов. Вы можете в правильном направлении?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Попробуйте awk с несколькими разделителями

awk -F"[_,]" -v OFS=, ' { if(/_/) { k=$3 } else { print k,$0 } } ' file

Спасибо @EdMorton, достаточно одного разделителя

awk -F_ -v OFS=, ' { if(/_/) { k=$3 } else { print k,$0 } } ' file

может быть сокращено до

awk -F_ -v OFS=, ' /_/ {k=$3;next} { print k,$0 } ' file

с заданными вами значениями

$ cat filex.txt
ABCDEF_XY_12345_PQRTS_67367
1,a,b,c1
2,a,b,c2
3,a,b,c3
APRTEYW_XY_23456_GDJHJH_232434
1,a,b,c4
2,a,b,c5
3,a,b,c6
GDHGJHG_XY_35237_FHDJFH_738278
1,a,b,c7
2,a,b,c8
3,a,b,c9

$ awk -F_ -v OFS=, ' { if(/_/) { k=$3 } else { print k,$0 } } ' filex.txt
12345,1,a,b,c1
12345,2,a,b,c2
12345,3,a,b,c3
23456,1,a,b,c4
23456,2,a,b,c5
23456,3,a,b,c6
35237,1,a,b,c7
35237,2,a,b,c8
35237,3,a,b,c9

$
1 голос
/ 14 марта 2019

1-е решение: Не могли бы вы попробовать один раз.

awk 'BEGIN{FS="_";OFS=","}/^[a-zA-Z]+/{val=$3;next} !/^\..*\.$/{print val,$0}' Input_file

2-е решение: Врегистр строки XY НЕ фиксирован в строке, затем попробуйте выполнить следующее.

awk '
BEGIN{
  FS="_"
  OFS=","
}
/^[a-zA-Z]+/ && match($0,/XY_[0-9]+_/){
  val=substr($0,RSTART+3,RLENGTH-4)
  next
}
!/^\..*\.$/{
  print val,$0
}
'   Input_file
...