Unix awk命令来执行特定的逻辑

Unix awk命令来执行特定的逻辑,unix,awk,csplit,Unix,Awk,Csplit,我对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 ...... 12345,1,a,b,c1 123

我对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
......
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
输出

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
......
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
从本质上讲,在
\u XY_[]\u
之间取子字符串,并将它们预先添加到以下行,如
、1、a、b、c1
,直到遇到字符串匹配模式
\u XY_[]\u
,然后重复相同的过程,直到EOF

我正在试图找到一种简单的方法来完成它,或者使用
awk
,或者将主文件拆分为多个较小的文件。你能告诉我正确的方向吗?

第一种解决方案:你能试一下下面的方法吗

awk 'BEGIN{FS="_";OFS=","}/^[a-zA-Z]+/{val=$3;next} !/^\..*\.$/{print val,$0}' Input_file
第二种解决方案:如果行中的
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

尝试使用多个分隔符
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

$

总是建议在你的帖子中添加你的努力。同时,通过查看您的个人资料,您知道您几乎没有选择正确的答案。所以,找个时间给它,当你发现你的问题答案很少时,试着从中选择一个正确答案。请检查并确认。您可以对您的问题(当前问题或旧问题)进行某种形式的结束,所有这些问题都对您有利。如果这些
行实际上不存在于您的实际输入中,则从示例输入中删除它们,因为它们只会混淆您的示例。@user1637487,你能告诉我这些代码是否对你有帮助吗?