将两个不同文件的行交错排列

2 投票
5 回答
518 浏览
提问于 2025-04-17 13:11

我有一个简单的任务,但我不知道该怎么做,现在卡住了。我需要把两个不同文件的内容每4行交替插入:

文件1:

1
2
3
4
5
6
7
8
9
10
11
12

文件2:

A
B
C
D
E
F
G
H
I
J
K
L

期望的结果:

1
2
3
4
A
B
C
D
5
6
7
8
E
F
G
H
9
10
11
12
I
J
K
L

我在找一个sed、awk或者python脚本,或者其他的bash命令。

谢谢你的时间!!

我试着用一些特定的python库来识别每个文件的4行模块,但没有成功。现在我想不使用这些库来做,但不知道该怎么做。

import sys
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord


def main(forward,reverse):

    for F, R in zip ( SeqIO.parse(forward, "fastq"), SeqIO.parse(reverse, "fastq") ):

        fastq_out_F = SeqRecord( F.seq, id = F.id, description = "" )
        fastq_out_F.letter_annotations["phred_quality"] = F.letter_annotations["phred_quality"]

        fastq_out_R = SeqRecord( R.seq, id = R.id, description = "" )
        fastq_out_R.letter_annotations["phred_quality"] = R.letter_annotations["phred_quality"]

        print fastq_out_F.format("fastq"),
        print fastq_out_R.format("fastq"),


if __name__ == '__main__':
    main(sys.argv[1], sys.argv[2])  

5 个回答

1

如果你没有GNU版的sed,可以用pastesed的组合来处理。

paste -d '\n' f1 f2 | sed -e 'x;N;x;N;x;N;x;N;x;N;x;N;x;N;s/^\n//;H;s/.*//;x'

如果你对sed不太熟悉,它有一个叫做“保留空间”的第二个缓冲区,可以用来保存数据。x命令可以交换当前缓冲区和保留空间的内容,N命令会把一行内容添加到当前缓冲区,而H命令则是把当前缓冲区的内容添加到保留空间。

所以,第一次使用x;N时,会把当前行(因为用paste,所以是来自f1的内容)保存到保留空间,然后读取下一行(来自f2的内容)。接下来,每次使用x;N;x;N时,都会从f1和f2中读取新的一行。最后,脚本会把f2中的新行去掉,把f2的内容放到f1的行后面,清空保留空间以便下次使用,然后打印出8行内容。

1

这可以用纯bash来实现:

f1=""; f2=""
while test -z "$f1" -o -z "$f2"; do
  { read LINE && echo "$LINE" && \
      read LINE && echo "$LINE" && \
      read LINE && echo "$LINE" && \
      read LINE && echo "$LINE"; } || f1=end;
  { read -u 3 LINE && echo "$LINE" && \
      read -u 3 LINE && echo "$LINE" && \
      read -u 3 LINE && echo "$LINE" && \
      read -u 3 LINE && echo "$LINE"; } || f2=end;
done < f1 3< f2

这个方法的核心思想是使用一个新的文件描述符(这里是3),同时从stdin和这个文件描述符中读取数据。

4

这可能对你有帮助:(使用GNU sed)

sed -e 'n;n;n;R file2' -e 'R file2' -e 'R file2' -e 'R file2' file1

或者使用paste/bash:

paste -d' ' <(paste -sd'   \n' file1) <(paste -sd'   \n' file2) | tr ' ' '\n'

或者:

parallel -N4 --xapply 'printf "%s\n%s\n" {1} {2}'  :::: file1 :::: file2

撰写回答