使用 awk 分割列

使用 awk 分割列

我有一个如下所示的文件。第 9 列的值由 ** 连接。

chrXV   234346  234546  snR81   +       SNR81   chrXV   234357  0.0003015891774815342**0.131826816475   +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234385  0.0002208827994288481**0.0118547789578  +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234396  0.0001799579220002955**0.00583993781634 +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234410  0.003451057940295026**0.00352844797952  +

我想要一个输出,其中可以将 2 个值作为单独的列。如何在 awk 中执行此操作。

这就是我想要的输出。显示输出的第一行:

chrXV   234346  234546  snR81   +   SNR81   chrXV   234357  0.0003015891774815342   0.131826816475  +

答案1

不知道为什么人们使用 cat 将文件通过管道传输到 awk,而 tr 答案仅将一个字符转换为另一个字符,因此 any*被转换为space.

简单的 awk 解决方案

awk -F"**" '$1=$1' OFS="\t" file 

对于所有字段之间的选项卡

awk 'sub(/\*\*/," "){$1=$1}1' OFS="\t" file

还有一个

awk 'gsub(/(*| )+/,"\t")' file

sed命令

sed 's/[* ]\+/\t/g' file

tr命令

tr -s '* ' '\t'  < file

答案2

一定是awk吗?为什么不cat file | tr '**' ' '直接将 ** 替换为三个空格

答案3

cat text.txt  |awk '{ split($9,a , "**"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,$6,$7,$8, a[1], a[2],$10); }'

输出是:

chrXV   234346  234546  snR81   +   SNR81   chrXV   234357  0.0003015891774815342   0.131826816475  +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234385  0.0002208827994288481   0.0118547789578 +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234396  0.0001799579220002955   0.00583993781634    +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234410  0.003451057940295026    0.00352844797952    +

答案4

awk -F'**' 'BEGIN{OFS="   ";} {print $1,$2}' file

使用 '**' 作为分隔符并设置三个空格作为输出分隔符

相关内容