awk:通过特定的分隔符删除string

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

input: --- 22:16050075:A:G 16050075 AG --- 22:16050115:G:A 16050115 GA --- 22:16050213:C:T 16050213 CT --- 22:16050319:C:T 16050319 CT --- 22:16050527:C:A 16050527 CA desired output: --- 22 16050075 16050075 AG --- 22 16050115 16050115 GA --- 22 16050213 16050213 CT --- 22 16050319 16050319 CT --- 22 16050527 16050527 CA 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 AG --- 16050115 16050115 GA --- 16050213 16050213 CT --- 16050319 16050319 CT --- 16050527 16050527 CA 

在解除限制器上拆分第2列:$2值更新为所需元素( temp[2] )并打印剩余的字段( {}1基于FS重新构建所有单个字段并打印出来)。

推荐使用多个去限制器,因为它改变了各个字段的绝对位置,而split()使得容易保留位置并提取所需的值。


为了您的更新需求添加一个新的列,只是做

 awk '{split($2,temp,":"); $2=temp[1] FS temp[2];}1' file --- 22 16050075 16050075 AG --- 22 16050115 16050115 GA --- 22 16050213 16050213 CT --- 22 16050319 16050319 CT --- 22 16050527 16050527 CA 

另外,如果你有GNU awk / gawk你可以使用它的gensub()作为正则表达式(使用POSIX字符类[[:digit]]提取为

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

gensub(/^([[:digit:]]+):([[:digit:]]+).*$/,"\\1 \\2","g",$2)前两个字段的解除限制为:与捕获组\\1\\2并打印其余字段。

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

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

file包含您的初始输入。

输出 –

 --- 16050075 16050075 AG --- 16050115 16050115 GA --- 16050213 16050213 CT --- 16050319 16050319 CT --- 16050527 16050527 CA 

编辑

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

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

产量

 --- 22 16050075 16050075 AG --- 22 16050115 16050115 GA --- 22 16050213 16050213 CT --- 22 16050319 16050319 CT --- 22 16050527 16050527 CA 

你也可以使用sed:

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