Awk:如何每四行替换一个字符串?

Awk:如何每四行替换一个字符串?,awk,sed,Awk,Sed,我有一个文件,其中每四行如下所示: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于感兴趣的人,此文件包含DNA序列) 我需要删除空格后面的所有内容,除了空格后面的第一个数字(在本例中为1),然后在字符串开头和数字之间插入/,因此我得到以下结果: HISEQ15:454:D27KKACXX:6:2316:16241:100283/1 我只知道Perl,而我的文件>10GB,这将花费我一辈子的时间,所以我希望你能帮助

我有一个文件,其中每四行如下所示:

  HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG 
(对于感兴趣的人,此文件包含DNA序列)

我需要删除空格后面的所有内容,除了空格后面的第一个数字(在本例中为
1
),然后在字符串开头和数字之间插入
/
,因此我得到以下结果:

  HISEQ15:454:D27KKACXX:6:2316:16241:100283/1
我只知道Perl,而我的文件>10GB,这将花费我一辈子的时间,所以我希望你能帮助我学习awk知识。

这是怎么回事

awk 'BEGIN{OFS="/"} NR%4==1{$2=$2*1}1' file
使用
NR%4==1
我们得到的所有行号都是4K+1。在这些行中,我们执行
{$2=$2*1}
,即将空格后的第二部分转换为数字。然后使用
{}1
打印所有行。 为了使记录以“/”分隔,我们使用
BEGIN{OFS=“/”}
部分,因为OFS代表“输出字段分隔符”

请注意,条件
NR%4==1
可能会根据要更改的字符串的位置而更改。如果是1号,5号,9号。。。这样没关系。如果是2号,6号。。。然后
NR%4==2
依此类推

试验 你可以用它来做,我认为它更干净:

sed 's! \([0-9]\).*!/\1!;n;n;n;' input
与:


我不认为Perl程序需要更长的时间来完成这项工作,除非使用循环遍历文件。(这将在进行任何处理之前加载整个文件。)主要的瓶颈通常是IO,无论您使用何种语言

$ perl -pe 's( (\d).*){/$1} if $. % 4 == 1' filename
这(很大程度上)相当于

while ( <ARGV> ) {
    s[ (\d).*][/$1] if $. % 4 == 1;
    print $_
}
如果要就地修改文件,只需在命令中添加一个。
如果需要备份
-i'.orig'
,也可以给出一个参数

$ perl -i -pe 's( (\d).*){/$1}' filename

谢谢,那将是几乎完美的-只有任何一个数字可以在空格后出现,它不必是1。哦,现在我注意到@DoubleDecker。我正在检查,给我几分钟:)@DoubleDecker检查我的最新答案。我想现在已经完成了。谢谢,但再一次,空格后的1只是一个例子,它可以是我需要保留的任何一个数字,因此它可以是/2等等。取决于空格后出现的数字。这里没有硬编码的1,它应该与空格后的任何数字一起工作,请注意,在
awk
版本中,输出是
…283 1
,而不是
…283/1
。在我的解决方案中,它被解决了。Fedoroqui是对的,我们没有以某种方式添加斜杠。sed产生的输出与输入完全相同;s因为你对第1、5、9行感兴趣。。。而我的答案是第4、8、12行。。。作为一个初学者,我在问:你确定Perl脚本会比awk/sed慢吗?如果是,为什么?您能给出一个示例输入,感兴趣的行号到底是什么?Awk与Perl的处理时间是不相关的,因为无论如何,您将花费几乎所有的时间在I/O等待上+1.
while ( <ARGV> ) {
    s[ (\d).*][/$1] if $. % 4 == 1;
    print $_
}
$ perl -pe 's( (\d).*){/$1}' filename
$ perl -i -pe 's( (\d).*){/$1}' filename