通过特定分隔符删除字符串

2024-05-17

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

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命令可以做到吗?

谢谢。


只需使用POSIX兼容的split()功能于$2 as

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过特定分隔符删除字符串 的相关文章

随机推荐