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>]_
之间获取子字符串并将它们添加到 <STRING>,1,a,b,c1
等行之前,直到我们遇到字符串匹配模式 _XY_[<STRING>]_
然后重复相同的过程直到 EOF。
我正在尝试找到一种简单的方法来使用 awk
或将主文件拆分为多个较小的文件。请问方向正确吗?
第一个解决方案:请您尝试一次。
awk 'BEGIN{FS="_";OFS=","}/^[a-zA-Z]+/{val=;next} !/^\..*\.$/{print val,[=10=]}' Input_file
第二个解决方案: 如果 XY
字符串的位置未固定在行中,请尝试以下操作。
awk '
BEGIN{
FS="_"
OFS=","
}
/^[a-zA-Z]+/ && match([=11=],/XY_[0-9]+_/){
val=substr([=11=],RSTART+3,RLENGTH-4)
next
}
!/^\..*\.$/{
print val,[=11=]
}
' Input_file
尝试使用多个分隔符awk
awk -F"[_,]" -v OFS=, ' { if(/_/) { k= } else { print k,[=10=] } } ' file
谢谢@EdMorton,单个分隔符就足够了
awk -F_ -v OFS=, ' { if(/_/) { k= } else { print k,[=11=] } } ' file
可以进一步缩短为
awk -F_ -v OFS=, ' /_/ {k=;next} { print k,[=12=] } ' 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= } else { print k,[=13=] } } ' 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
$
我不太擅长 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
或将主文件拆分为多个较小的文件。请问方向正确吗?
第一个解决方案:请您尝试一次。
awk 'BEGIN{FS="_";OFS=","}/^[a-zA-Z]+/{val=;next} !/^\..*\.$/{print val,[=10=]}' Input_file
第二个解决方案: 如果 XY
字符串的位置未固定在行中,请尝试以下操作。
awk '
BEGIN{
FS="_"
OFS=","
}
/^[a-zA-Z]+/ && match([=11=],/XY_[0-9]+_/){
val=substr([=11=],RSTART+3,RLENGTH-4)
next
}
!/^\..*\.$/{
print val,[=11=]
}
' Input_file
尝试使用多个分隔符awk
awk -F"[_,]" -v OFS=, ' { if(/_/) { k= } else { print k,[=10=] } } ' file
谢谢@EdMorton,单个分隔符就足够了
awk -F_ -v OFS=, ' { if(/_/) { k= } else { print k,[=11=] } } ' file
可以进一步缩短为
awk -F_ -v OFS=, ' /_/ {k=;next} { print k,[=12=] } ' 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= } else { print k,[=13=] } } ' 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
$