字符第一次出现时的awk分割

字符第一次出现时的awk分割,awk,Awk,尝试使用awk拆分每一行。如果有多个p或q则上的第二个拆分(无法正常工作(例如,第2行。如果出现多个拆分,我无法忽略第二个拆分。我尝试了^pq,但没有产生所需的拆分。谢谢:) 文件 1p11.2(120785011_120793480)x3 1q12q21.1(143192432_143450240)x1~2 awk awk '{split($0,a,"[pq(_]"); print "id"a[1],a[3]}' file 当前 id1 120

尝试使用
awk
拆分每一行。如果有多个
p
q
上的第二个拆分(
无法正常工作(例如,第2行。如果出现多个拆分,我无法忽略第二个拆分。我尝试了
^pq
,但没有产生所需的拆分。谢谢:)

文件

1p11.2(120785011_120793480)x3   
1q12q21.1(143192432_143450240)x1~2
awk

awk '{split($0,a,"[pq(_]"); print "id"a[1],a[3]}' file
当前

id1 120785011
id1 21.1
所需的

id1 120785011
id1 143192432

另一个
awk

$ awk -F'[(_]' '{split($0,a,"[pq]"); print "id"a[1],$2}' file

id1 120785011
id1 143192432

由于您不控制行中
pq
s的数量,请使用两个不同的拆分,一个用于字段分隔符以查找值,另一个用于id。
split
函数返回字段数量,因此我们可以利用这一点:

{
    n = split($0, a, /[pq(_]/)
    printf "id%s %s\n", a[1], a[n-1]
}
输出

ID120785011
ID114192432

以下是使用
FS
regex本身并保持
awk
简单的方法:

awk-F'[(|][pq]([^pq]*[pq])*“{print”id“$1,$3}”文件
ID120785011
ID114192432
FS
regex详细信息

  • ”[()
  • |
    :或
  • [pq]([^pq]*[pq])*
    :匹配
    p
    q
    ,后跟0个或多个非pq字符,后跟
    p
    q

我会使用sed,因为它是一行上的简单替换,这是sed最适合的:

$ sed 's/\([^pq]*\)[^(]*(\([^_]*\).*/id\1 \2/' file
id1 120785011
id1 143192432