使用bash或awk按特定方案重新排序文本文件行

时间:2018-02-14 13:28:30

标签: bash awk sed grep sh

我需要弄清楚如何在bash中重新排序一个文本文件,该文件由另一个脚本组成,由许多具有特定方案的行组成。这是其中的12个。

>NODE_3
nucleotide_cov: 170.3683
GC_CONT: 37.00
>NODE_18
nucleotide_cov: 168.8670
GC_CONT: 37.00
>NODE_23
nucleotide_cov: 178.0648
GC_CONT: 35.00
>NODE_41
nucleotide_cov: 174.4054
GC_CONT: 36.00

所需的输出是:

GC_CONT: 37.00  nucleotide_cov: 170.3683    >NODE_3
GC_CONT: 37.00  nucleotide_cov: 168.8670    >NODE_18
GC_CONT: 35.00  nucleotide_cov: 178.0648    >NODE_23
GC_CONT: 36.00  nucleotide_cov: 174.4054    >NODE_41

其中每列都按制表符分隔,因此“\ t”和GC_CONT需要是它们的第一个值。 awk解决方案首选。

修改

我会更加清楚。这是使用

的输出文件
awk 'NR%3{printf "%s ",$0;next;}1' input.txt 

>NODE_3 nucleotide_cov: 170.3683 GC_CONT: 37.00
>NODE_18 nucleotide_cov: 168.8670 GC_CONT: 37.00
>NODE_23 nucleotide_cov: 178.0648 GC_CONT: 35.00
>NODE_41 nucleotide_cov: 174.4054 GC_CONT: 36.00

很好,但我需要格式化它们,以便在每一行的开头都有“GC_CONT:”。

4 个答案:

答案 0 :(得分:2)

选择你喜欢的人:

简单 awk 单行:

awk '/^>/{ n=NR; r=$0; next }{ r=$0 OFS r; if (NR-n==2) print r }' OFS='\t' input.txt

或严格的行顺序的 awk 解决方案:

awk '/^>/{ r1=$0; n=NR }
     n{ if (NR == n+1) r2=$0; else if (NR == n+2) print $0, r2, r1 }' OFS='\t' input.txt

输出:

GC_CONT: 37.00  nucleotide_cov: 170.3683    >NODE_3
GC_CONT: 37.00  nucleotide_cov: 168.8670    >NODE_18
GC_CONT: 35.00  nucleotide_cov: 178.0648    >NODE_23
GC_CONT: 36.00  nucleotide_cov: 174.4054    >NODE_41

答案 1 :(得分:2)

试试这个awk脚本:

/^>/    {node=$0}
/^nucl/ {nucl=$0}
/^GC/   {print $0 "\t" nucl "\t" node}

或者,从命令行:

awk '/^>/{node=$0} /^nucl/{nucl=$0} /^GC/{print $0 "\t" nucl "\t" node}' input_file

答案 2 :(得分:2)

仅提供标记为sed的信息:

sed -r '/^>/{N;N;s/(.*)\n(.*)\n(.*)/\3\t\2\t\1/g}'

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;N;/\n>/!s/(.*)\n(.*)/\2\t\1/;ta;P;D' file

收集记录所需的行,交换行并用标签替换换行符。