在文件中切割相同长度但具有新标识符的行

时间:2012-02-23 18:04:58

标签: perl

我有一个文件,其第二行的长度不等。我想让这些行相等(每个第二行输出应该等于10个字符)但是使用新的标识符(每个奇数行)。

文件 - >

>ZQMK36301EDYQE
ZHZHHEXZZHHZZHHZZXHHHEHHHZZZHHHZHXZHZ
>ZQMK36301EEMJ9
ZZZXHZHHXHHHEZZEEZZHZZZZXEZ
>ZQMK36301EOEM5
ZXHXHZZHEHHHXZEZHXXXHXHHHHXEHHHZHHHH


desired output ->


>ZQMK36301EDYQE
ZHZHHEXZZH
>ZQMK36301EDYQE#2
HZZHHZZXHH
>ZQMK36301EDYQE#3
HEHHHZZZHH
>ZQMK36301EEMJ9
ZZZXHZHHXH
>ZQMK36301EEMJ9#2
HHEZZEEZZH
>ZQMK36301EOEM5
ZXHXHZZHEH
>ZQMK36301EOEM5#2
HHXZEZHXXX
>ZQMK36301EOEM5#3
HXHHHHXEHH

这里,如果我们取第一行是标识符(> ZQMK36301EDYQE),在第二行中它包含37个字符。现在它将生成3个相等长度的序列(i:e 10),如果剩余的字符小于10,我们将抛出该部分。现在,每个等长的新行都有一个标识符,它与序列的一部分相同,后跟“#”和数字。我想为整个文件做这个。请帮忙。

谢谢和致以诚挚的问候, 维卡斯

1 个答案:

答案 0 :(得分:1)

作为一个单行:

perl -nwle '
     $i=0; 
     for my $add (<>=~/.{10}/g) { 
         printf "%s%s\n%s\n", $_, $i++ ? "#$i":"", $add; 
     }' inputfile

-n逐行读取文件并在$_中存储行。 -l自动输入输入。我们假设第一行是标题,第二行是数据。 $i是计数器,因此每个新线对都会重置。 for循环列表是通过读取一行<>,然后使用正则表达式从中提取10个字符的长字符串而动态制作的。然后我们只打印东西,并确保不显示零计数器。