我有一个如下所示的文件。第 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
使用 '**' 作为分隔符并设置三个空格作为输出分隔符