2017-10-26 14 views
-3

여러 체스 게임의 플라이 시퀀스가 ​​포함 된 파일이 있습니다. 게임은 하나 이상의 새 라인으로 구분되며 각 게임의 해당 플라이 시퀀스는 여러 라인으로 나눌 수 있습니다.체스 플라이 시퀀스의 라인 병합

동일한 게임에 해당하는 모든 행을 병합하여 게임 당 한 행만 포함하고 싶습니다. 나는 다른 옵션을 시도했지만 아무도 효과가 없었습니다. 파일에 14M 이상의 게임이 포함되어 있으므로 빠른 솔루션이 필요합니다. 나는 리눅스에서 일한다.

예 :

e4 e5 Bb5 c6 Bc4 b5 Bxf7+ Kxf7 Nf3 Qf6 d4 d6 dxe5 dxe5 
Bg5 Qe6 Nc3 Be7 Be3 Nf6 b4 Rd8 Ng5+ Kg8 Nd5 Qd6 Qf3 cxd5 
Bc5 Qe6 Nxe6 Bxe6 Bxe7 


e4 e5 Nf3 Qf6 Bc4 Bc5 Nc3 c6 Na4 Bb4 c3 Ba5 Nc5 d6 Nb3 
Bb6 d4 h6 dxe5 dxe5 O-O Ne7 Be3 Nd7 Bxb6 Nxb6 Be2 O-O 
Nc5 Ng6 b4 Nf4 Nd3 Rd8 Qc2 Nc4 Nxf4 Na3 Qb3 Qxf4 
Qxa3 Qxe4 Rfe1 f6 Qb3+ Kh8 Bd1 Qf4 Bc2 Bg4 Re4 Qf5 Rxe5 
Qd7 Re3 Qd6 Nh4 Qd5 Ng6+ Kh7 Ne7+ f5 Nxd5 Rxd5 c4 Rd2 
h3 Bh5 Bxf5+ Kh8 


e4 e5 Nf3 Nc6 Bb5 Nf6 Bxc6 bxc6 O-O d6 h3 Nxe4 Re1 Bf5 
d4 f6 dxe5 fxe5 Nbd2 Nxd2 Bxd2 Be7 Qc1 O-O c3 h6 c4 e4 
Nd4 Qd7 b3 d5 Nxf5 Qxf5 Be3 Bf6 Rb1 d4 Bd2 c5 


d4 Nf6 Nc3 d5 Bg5 Ne4 Nxe4 dxe4 c3 h6 Be3 e6 Qc2 f5 g4 
Be7 Bg2 O-O O-O-O Nd7 d5 Nb6 dxe6 Qe8 gxf5 Rxf5 Bxe4 Rf8 
Bh7+ Kh8 Bg6 

이 될해야 :

e4 e5 Bb5 c6 Bc4 b5 Bxf7+ Kxf7 Nf3 Qf6 d4 d6 dxe5 dxe5 Bg5 Qe6 Nc3 Be7 Be3 Nf6 b4 Rd8 Ng5+ Kg8 Nd5 Qd6 Qf3 cxd5 Bc5 Qe6 Nxe6 Bxe6 Bxe7 
e4 e5 Nf3 Qf6 Bc4 Bc5 Nc3 c6 Na4 Bb4 c3 Ba5 Nc5 d6 Nb3 Bb6 d4 h6 dxe5 dxe5 O-O Ne7 Be3 Nd7 Bxb6 Nxb6 Be2 O-O Nc5 Ng6 b4 Nf4 Nd3 Rd8 Qc2 Nc4 Nxf4 Na3 Qb3 Qxf4 Qxa3 Qxe4 Rfe1 f6 Qb3+ Kh8 Bd1 Qf4 Bc2 Bg4 Re4 Qf5 Rxe5 Qd7 Re3 Qd6 Nh4 Qd5 Ng6+ Kh7 Ne7+ f5 Nxd5 Rxd5 c4 Rd2 h3 Bh5 Bxf5+ Kh8 
e4 e5 Nf3 Nc6 Bb5 Nf6 Bxc6 bxc6 O-O d6 h3 Nxe4 Re1 Bf5 d4 f6 dxe5 fxe5 Nbd2 Nxd2 Bxd2 Be7 Qc1 O-O c3 h6 c4 e4 Nd4 Qd7 b3 d5 Nxf5 Qxf5 Be3 Bf6 Rb1 d4 Bd2 c5 
d4 Nf6 Nc3 d5 Bg5 Ne4 Nxe4 dxe4 c3 h6 Be3 e6 Qc2 f5 g4 Be7 Bg2 O-O O-O-O Nd7 d5 Nb6 dxe6 Qe8 gxf5 Rxf5 Bxe4 Rf8 Bh7+ Kh8 Bg6 
+1

당신은 몇 가지 해결책을 시도했다고 말했습니까? – Aserre

+0

@Aserre [문자] [문자] [문자]로 [문자] [새 줄] [문자]를 대체하는 대신 'sed'로 대체하는 방법을 생각했지만 그럴 수는 없었습니다. –

답변

1

AWK, 당신은 기록이 빈 줄로 구분되어 있습니다 빈 문자열에 레코드 분리를 설정할 수 있습니다. SED와 함께, 대안으로,

awk -v RS="" '{gsub("\n", " ")} 1' infile 

을 또는 : 그럼 당신은 공백으로 각 레코드에 대한 줄 바꿈을 대체이 작동

sed ':a;N;/\n$/!s/\n//;ta;s/\n$//;/^$/d' infile 

을 다음과 같이

:label   # Label to jump back to 
N    # Append next line to pattern sapce 
/\n$/! s/\n// # If pattern space does not end with newline, remove newline 
t label  # Jump back to label if we changed something 
s/\n$//  # Remove trailing newline 
/^$/ d   # Delete empty line 

마지막 명령을 주어진 입력에 대해 꼭 필요한 것은 아니지만 연속 된 빈 행이 두 개 이상 있으면 빈 행이없는 빈 출력 행이 있습니다. sed 명령을 awk 명령과 동일하게 만드는 것입니다.

+0

죄송합니다. 또 다른 문제가있어서 솔루션이 작동하지 않는 것입니다. 나는 다른 것을 해결했고 이제는 완벽하게 작동합니다. 감사! –