2017-02-22 135 views
3

我有一个文件中的几列,其中第二列有“:”分隔符,我想删除第二列中的第一,第三和第四个字符串,并留下第二个字符串在那一栏。但我有正常的分隔符空间,所以我不知道。awk:通过特定分隔符删除字符串

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

谢谢。

+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根据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)部分仅捕获前012栏的:限制的前两个字段与捕获组\\1\\2并打印其余字段。

+0

如果我打印--- 22 16050075 16050075 AG --- 22 16050115 16050115 GA --- 22 16050213 16050213 CT --- 22 16050319 16050319 CT --- 22 16050527 16050527 CA –

+0

我更新非常感谢你太 –

+0

@PeterChung:请参考我的更新 – Inian

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 

EDIT

随着输入文件中的变化(附加列号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 
+0

谢谢,它效果不错 –

+0

你错过了专栏2美元,只是添加它。 –

+0

@ClaesWikner,OP改变了输入文件。我现在改变了我的命令。感谢您的高举。 – VM17

3

您也可以使用sed:

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