2012-02-17 165 views
0

我需要您对多行条目进入不同列的帮助。并对文件中的所有条目执行相同的操作。将基于行的条目转换为基于shell的列

文件示例(只显示2项,还有很多这样的):需要

>ABC 
* 
AGA-AUUCUC-CGGUUCAAUCU 
||| 
UCUAUAACCGCGCCGAGUUAGU 

>ABC 
* 
AGAUAU-GCUGCAGGCUCAAUUG 
|||||| 
UCUAUAACCGCG-CCGAGUUAGU 

文件格式:

>ABC AGA-AUUCUC-CGGUUCAAUCU UCUAUAACCGCGCCGAGUUAGU 
>ABC AGAUAU-GCUGCAGGCUCAAUUG UCUAUAACCGCG-CCGAGUUAGU 

我能够通过向单个条目转换成需要的格式:

tr '\n' '\t' <test3 | awk '{print $1,$3,$5}' 

但是,如何通过读取整个文件来处理所有条目?

回答

0

我认为你和你原来的awk解决方案在正确的轨道上。尝试这个;我认为这是可读的,有效的良好结合:

awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile 

这样做是为了告诉awk来处理空行(连续2个新行)作为记录分隔符。然后将每个节作为单个记录处理,并且空白(在本例中为单个换行符)将字段分隔开。这与tr的处理非常相似,除了现在awk将一次处理整个文件处理节。

0

下面是使用Perl的一种方式:

perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }' 

,将打印第1,第3,第5,第7,等等,文件的线路。在第5,11,11和17行之后,它将打印换行符;在其他行之后,它将只打印一个选项卡。

(注:这是假定有五行连续组之间正好有一个空行如果这的话,那么请澄清。)

+0

谢谢ruakh。我只是用Python编写了一个脚本,它完全一样。 – Bade 2012-02-17 20:31:41

1

您可以使用awk这样的:

awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test 


说明:

你需要知道这两日英格斯约awk

  • 语法condition { commands },如果condition为真,其中commands被executied(非零)。

  • NR是(即,行数)当前记录的数目,从1开始


这里,条件是NR%2,这是非零奇数为数字线。所以该命令仅对奇数行执行,这些行是您要打印的行。偶数行被无声丢弃。

printf将打印每一个奇数行,然后是空格或换行符。您的输入每6行重复一次,并且您希望在第5,11,17,之后换行。您可以将这些数字中的每一个加1以使其可以被6整除,因此对于这些数字,公式(NR+1)%6为0。

因此(NR+1)%6 ? " " : "\n"的计算结果为行1和行3的空间,行5的换行符。然后重复7,9和11;等等。