다른 파일에서 일치하는 줄을 인쇄해야 합니다.

다른 파일에서 일치하는 줄을 인쇄해야 합니다.

예를 들어 다음과 같은 데이터가 있습니다.

1111111
test1
test2
test3
1111111
block 1
block 2
block 3
1111111
page1
page2
page3

아래와 같이 내용을 다른 파일로 인쇄하고 싶습니다.

Test1 - File
1111111
test1
test2
test3


Block - File2
1111111
block 1
block 2
block 3


Page - File3
1111111
page1
page2
page3

답변1

그럼 이 파일을 로 분할하고 싶은 거죠 11111111?

노력하다

awk -vRS=1111111 'NR>1{print RS$0 >"file"NR-1}' file

답변2

csplit -zf file file.txt /^1111111/ "{*}"

csplit(coreutils)는 상황에 맞는 줄(줄 수, 패턴)별로 파일을 분할하는 데 좋은 명령입니다.

답변3

awk파일에 헤더가 없는 또 다른 가능성은 다음과 같습니다.

awk '/^1111111/ { close("file" i); i++; } { print > "file" i; }' file

두 번째에는 헤더가 있습니다. 헤더가 첫 번째 커밋 이후에 구성되었다고 가정하기 때문입니다. 1111111하지만 마지막 커밋에서는 그렇지 않은 것 같습니다.

awk '/^1111111/ { close(f); i++; s = $1; next; } { if (s) { f = "file" i; header = toupper(substr($1, 1, 1)) substr($1, 2)  " - File" i; print header ORS s > f; s = ""; } print > f; }' file

답변4

이것은 당신에게 도움이 될 것입니다

#!/usr/bin/perl

use strict;
use warnings;


my$in=shift(@ARGV);
my$filecount=0;
my$open=0;

open(IN,'<',$in) or die $!;
while(<IN>) #reading input file
{
    if($_=~/^111/) #start new output file, if a line begins with multiple 1s
    {
        close OUT or die $! if $open==1;
        $filecount++;
        open(OUT,'>','out-'.$filecount.'.txt') or die $!;
        $open=1;
        print OUT $_;
    }
    else
    {
        print OUT $_;
    }
}
close IN or die $!;
close OUT or die $!;

더 효율적인 방법이 있다고 확신하지만 이것이 가장 먼저 떠오르는 것입니다 :-)

관련 정보