我的文件中没有几列,其中第二列带有“:”定界符,我想删除第二列中的第一,第三和第四字符串,并将第二字符串保留在该列中。但是我有正常的定界符空间,所以我不知道。
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
如
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
character class [[: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
并照此打印其余字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句