繁体   English   中英

Unix awk命令执行特定的逻辑

[英]Unix awk command to execute a specific logic

我对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

本质上,取_XY_[<STRING>]_之间的子字符串, _XY_[<STRING>]_它们放在诸如<STRING>,1,a,b,c1类的以下行之前<STRING>,1,a,b,c1直到遇到匹配模式_XY_[<STRING>]_ ,然后重复相同的过程直到EOF。

我试图找到一种简单的方法,可以使用awk或将主文件拆分为多个较小的文件。 您能朝正确的方向吗?

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

$

第一种解决方案:请您尝试一次。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM