Python 将两个不同文件的行穿插在一起

Python 将两个不同文件的行穿插在一起,python,sed,awk,Python,Sed,Awk,我必须做一个简单的任务,但我不知道怎么做,我被押上了赌注。我需要穿插两个不同文件的行,每行4行: 文件1: 1 2 3 4 5 6 7 8 9 10 11 12 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 文件2: 1 2 3 4 5 6 7 8 9 10 11 12 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

我必须做一个简单的任务,但我不知道怎么做,我被押上了赌注。我需要穿插两个不同文件的行,每行4行:

文件1:

1
2
3
4
5
6
7
8
9
10
11
12
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
文件2:

1
2
3
4
5
6
7
8
9
10
11
12
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
所需结果:

1
2
3
4
5
6
7
8
9
10
11
12
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命令

谢谢你的时间


我尝试使用能够识别每个文件的4行模块的特定python库来实现这一点。但它不起作用,现在我试图在没有这个库的情况下实现它,但不知道如何实现

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])  

你发布的代码看起来非常复杂。编程有一条经验法则:总是有一个更简单的解决方案。在您的情况下,更简单

您应该做的第一件事是确定输入的限制。你要处理非常大的文件吗?或者它们的大小只有1或2 KB?这很重要

第二件事:看看这个。有了Python,您就有了其他功能。尝试将这些工具结合起来以产生所需的结果

在你的特殊情况下,有一些不清楚的地方。如果输入文件大小不同,脚本应该怎么做?或者其中一个是空的?还是说行数不是四的因子?你应该决定如何处理这样的极端情况

看一看,然后。如果你喜欢用很酷的方式,你也可以看看这个模块。

这可能适合你:(使用GNU-sed)

或使用粘贴/bash:

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

尝试此操作,更改f1和f2的相应文件名值

awk 'BEGIN{
  sectionSize=4; maxSectionCnt=sectionSize; maxSectionCnt++
  notEof1=notEof2=1
  f1="file1" ; f2="file2"
   while (notEof1 && notEof2) {
    if (notEof1) {
      for (i=1;i<maxSectionCnt;i++) {
        if (getline < f1 >0 ) { print "F1:" i":" $0 } else {notEof1=0}
      }
    }
    if (notEof2) {
      for (i=1;i<maxSectionCnt;i++) {
        if (getline < f2 >0 ) { print "F2:" i":" $0 } else {notEof2=0}
      }
    }
  }
}'
awk'开始{
sectionSize=4;maxSectionCnt=sectionSize;maxSectionCnt++
notEof1=notEof2=1
f1=“file1”f2=“file2”
while(notEof1和notEof2){
如果(注1){
对于(i=1;i0){print“F1:i”:“$0}否则{notEof1=0}”
}
}
如果(注2){
对于(i=1;i0){print“F2:i”:“$0}否则{notEof2=0}”
}
}
}
}'
您还可以删除
“F1:i”:“
etc记录头。我添加了帮助调试代码

正如Pastafarianist正确指出的那样,如果您对如果文件大小不一样会发生什么有期望,那么您可能需要修改此选项,等等


我希望这有帮助。

可以在纯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
f1=“”;f2=“”
当测试-z“$f1”-o-z“$f2”时
{读取行&&echo“$LINE”&&\
读取行和回显“$LINE”和\
读取行和回显“$LINE”和\
读取行和回显“$LINE”}| | f1=end;
{read-u3行&&echo“$LINE”&&\
读取-u 3行和回显“$LINE”和\
读取-u 3行和回显“$LINE”和\
read-u3行和echo“$LINE”}| | f2=end;
完成

我们的想法是使用一个新的文件描述符(本例中为3),同时从
stdin
和该文件描述符中读取。

如果您没有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
将当前行(从f1开始,因为
粘贴
)保存在保留空间中,并读取下一行(从f2开始,因为
粘贴
),然后每个
x;N;x;N
读取f1和f2中的新行,脚本结束时从f2的4行中删除新行,将f2中的行放在f1行的末尾,为下一次运行清理保留空间,并将8行打印为Gerrat[编辑:并Rik Poggi]赛义德:向我们展示你的尝试。你不太可能得到太多帮助(尤其不太可能从最好的人那里得到帮助)如果你只是要求Stack Overflow为你做工作。证明你自己做了一次真正的尝试,你不仅会表明你是真诚地问的,而且会更清楚困难在哪里。我尝试使用特定的python库解析我的文件…你的真实文件有多大?祝你好运。它们是真实的太大了,大约25 GB。+1这是一个好问题。感谢@kev对反射的支持,xargs也可以提供一个解决方案。