【问题标题】:Unix awk command to execute a specific logicUnix awk 命令执行特定逻辑
【发布时间】:2019-08-04 18:20:06
【问题描述】:

我不太擅长 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>]_ 之间获取子字符串并将它们添加到<STRING>,1,a,b,c1 之类的后续行,直到我们遇到字符串匹配模式_XY_[<STRING>]_,然后重复相同的过程直到EOF。

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

【问题讨论】:

  • 始终建议您在帖子中添加您的努力。此外,通过查看您的个人资料,您知道您几乎没有选择任何答案作为正确答案。所以给它一些时间,当你看到你的问题的答案很少时,试着选择其中任何一个作为正确的答案。
  • 请检查someone-answersaccepted。您可以对您的问题(当前的问题或那些旧的问题)进行封闭式处理,这对您自己也有好处。
  • 如果这些 ...... 行实际上并不存在于您的真实输入中,那么请从您的示例输入中删除它们,因为它们所做的只是混淆您的示例。

标签: unix awk csplit


【解决方案1】:

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

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

【讨论】:

  • @user1637487,如果这些代码对您有帮助,请告诉我?
【解决方案2】:

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

$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多