我需要弄清楚如何在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:”。
答案 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
收集记录所需的行,交换行并用标签替换换行符。