gpt4 book ai didi

linux - 按特定分隔符删除字符串

转载 作者:IT王子 更新时间:2023-10-29 00:52:49 27 4
gpt4 key购买 nike

我在一个文件中有几列,其中第二列有“:”分隔符,我想删除第二列中的第一、第三和第四个字符串,并将第二个字符串留在该列中。但是我有正常的分隔符空间,所以我不知道。

input:

--- 22:16050075:A:G 16050075 A G
--- 22:16050115:G:A 16050115 G A
--- 22:16050213:C:T 16050213 C T
--- 22:16050319:C:T 16050319 C T
--- 22:16050527:C:A 16050527 C A

desired output:

--- 22 16050075 16050075 A G
--- 22 16050115 16050115 G A
--- 22 16050213 16050213 C T
--- 22 16050319 16050319 C T
--- 22 16050527 16050527 C A

Wrong:
cat df.txt | awk -F: '{print $1, $3, $6, $7, $8}'

--- 22 A
--- 22 G
--- 22 C
--- 22 C
--- 22 C

但我做不到。 awk 和 sed 命令可以做到吗?

谢谢。

最佳答案

只需在 $2 上使用 POSIX 兼容的 split() 函数即可

awk '{split($2,temp,":"); $2=temp[2];}1' file
--- 16050075 16050075 A G
--- 16050115 16050115 G A
--- 16050213 16050213 C T
--- 16050319 16050319 C T
--- 16050527 16050527 C A

在分隔符 : 上拆分第 2 列,将 $2 值更新为所需元素 (temp[2]) 并打印其余字段({}1 根据 FS 重新构造所有单独的字段并打印它)。

建议使用多个分隔符,因为它会改变各个字段的绝对位置,而 split() 可以轻松保留位置并仅提取所需的值。


对于添加新列的更新要求,只需执行

awk '{split($2,temp,":"); $2=temp[1] FS temp[2];}1' file
--- 22 16050075 16050075 A G
--- 22 16050115 16050115 G A
--- 22 16050213 16050213 C T
--- 22 16050319 16050319 C T
--- 22 16050527 16050527 C A

或者,如果您有 GNU awk/gawk,您可以将其 gensub() 用于正则表达式(使用 POSIX 字符类 [[:digit]]) 基于提取为

awk '{$2=gensub(/^([[:digit:]]+):([[:digit:]]+).*$/,"\\1 \\2","g",$2);}1' file
--- 22 16050075 16050075 A G
--- 22 16050115 16050115 G A
--- 22 16050213 16050213 C T
--- 22 16050319 16050319 C T
--- 22 16050527 16050527 C A

gensub(/^([[:digit:]]+):([[:digit:]]+).*$/,"\\1\\2","g", $2) 部分仅捕获由 分隔的前两个字段: 以及捕获组 \\1\\2并打印其余字段。

关于linux - 按特定分隔符删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42384007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com