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

时间:2017-02-22 06:15:51

标签: linux bash awk sed

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

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

谢谢。

3 个答案:

答案 0 :(得分:4)

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

即可
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 re - 根据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,并打印其余字段。

答案 1 :(得分:4)

您还可以尝试以下方法替代@ Inian更好,更便携的解决方案 -

awk -F '[ :]' '{print $1, $3, $6, $7, $8}' file

file包含您的初始输入。

输出 -

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

修改

随着输入文件的更改(附加列号2),上面的命令可以更改为 -

awk -F '[ :]' '{print $1, $2, $3, $6, $7, $8}' 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

答案 2 :(得分:3)

您也可以使用sed:

sed -r 's/..:([^:]+)[^ ]+/\1/' file