将两个不同文件的行交错排列
我有一个简单的任务,但我不知道该怎么做,现在卡住了。我需要把两个不同文件的内容每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
,可以用paste
和sed
的组合来处理。
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