awk 操作

awk 操作

我有一个这样的文件

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  RNU2-59P:99:122:hsa-miR-877-3p

这是一个制表符分隔的文件,我想要这样的结果

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

就像第三行一样,我有第三列和第四列。但应始终打印第一列和第二列,然后打印第三列,然后在下一行中打印第一列和第二列,然后打印第四列。

我怎样才能在 awk 中做到这一点

答案1

$ awk -v OFS='\t' '{for (i=3;i<=NF;i++)print $1,$2,$i}' file
SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

怎么运行的

  • -v OFS='\t'

    这将输出字段分隔符 AKA 设置OFS为制表符。

  • for (i=3;i<=NF;i++) print $1,$2,$i

    这将从第 3 列及其后的所有列开始运行循环,并将它们打印在第 1 列和第 2 列之前的行上。

答案2

awk '{print $1,$2,$3}$4{print $1,$2,$4}'

==

awk '{print $1,$2,$3;$3="\b"}$4'

或者

awk -v OFS="\t" '$4{$4="\n"$1"\t"$2"\t"$4}1'

==

awk -v OFS="\t" '$4{sub("^","\n"$1"\t"$2"\t",$4)}1'

如果您想要格式化输出,您可以使用 OFS 变量 by-v OFS='\t'或管道输出 viacolumn -t

相关内容