2

我有一个文件,每四行是这样的:

  HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG 

(对于那些感兴趣的人,这个文件包含 DNA 序列)

我需要删除空格之后的所有内容,除了空格之后的第一个数字(在这种情况下1),然后/在字符串的开头和数字之间插入,所以我得到了这个:

  HISEQ15:454:D27KKACXX:6:2316:16241:100283/1

我只知道 Perl,如果我的文件 >10GB,这将永远存在,所以我希望你能帮助你了解 awk 知识。

4

3 回答 3

4

那这个呢?

awk 'BEGIN{OFS="/"} NR%4==1{$2=$2*1}1' file

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

请注意,条件NR%4==1可能会根据要更改的字符串的位置而更改。如果是1号、5号、9号……这样就好了。如果是第 2 次、第 6 次……那么NR%4==2等等。

测试

$ cat a
HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG 
a
b
d
HISEQ15:454:D27KKACXX:6:2316:16241:100283 7:N:0:GTTTCG 
ad
f
d
HISEQ15:454:D27KKACXX:6:2316:16241:100283 9:N:0:GTTTCG 
$ awk 'BEGIN{OFS="/"}NR%4==1{$2=$2*1}5' a
HISEQ15:454:D27KKACXX:6:2316:16241:100283/1
a
b
d
HISEQ15:454:D27KKACXX:6:2316:16241:100283/7
ad
f
d
HISEQ15:454:D27KKACXX:6:2316:16241:100283/9
于 2013-08-14T14:39:57.110 回答
3

你可以用做到这一点,我认为它更干净:

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

使用

awk 'NR%4==1 { $0=$1"/"substr($2,1,1); }1' input
于 2013-08-14T14:43:56.597 回答
1

我认为 Perl 程序不会花费更长的时间来执行此操作,除非您使用for循环来遍历文件。(这将在任何处理发生之前加载整个文件。)主要瓶颈通常是 IO,无论您使用什么语言。

$ perl -pe 's( (\d).*){/$1} if $. % 4 == 1' filename

这(很大程度上)相当于

while ( <ARGV> ) {
    s[ (\d).*][/$1] if $. % 4 == 1;
    print $_
}

如果您需要调整要修改的行,只需将其更改为1所需的任何内容。
根据数据,您可以删除该if $. % 4 == 1部分。($.是当前行号)

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

如果要就地修改文件,只需-i在命令中添加一个。如果你想要一个备份,
你也可以给出一个论点。-i-i'.orig'

$ perl -i -pe 's( (\d).*){/$1}' filename
于 2013-08-14T18:50:50.637 回答