2010-12-07 2 views
3
A 나는 A 형식의 파일 (주파수, 파일 이름, 코드 줄)을 가지고있다.

다른 그룹의 줄 사이에 빈 줄 추가

1 file_name1 code_line1 
2 file_name2 code_line2 
2 file_name2 code_line3 
2 file_name3 code_line4 
2 file_name3 code_line5 
3 file_name4 code_line6 
3 file_name4 code_line7 
3 file_name4 code_line8 
1 file_name1 code_line1 

2 file_name2 code_line2 
2 file_name2 code_line3 

2 file_name3 code_line4 
2 file_name3 code_line5 

3 file_name4 code_line6 
3 file_name4 code_line7 
3 file_name4 code_line8 
다음과 같이 출력 B를 원한다.

1 file_name1 code_line1 

2 file_name2 code_line2 
2 file_name2 code_line3 

2 file_name3 code_line4 
2 file_name3 code_line5 

3 file_name4 code_line6 
3 file_name4 code_line7 
3 file_name4 code_line8 

기본적으로 A 파일은 다음과 같은 파일 이름과 코드 라인을 포함한다. 파일 및 첫 번째 필드는 빈도, 즉 파일의 코드 줄 수입니다.

이 코드 줄을 현명하게 처리해야합니다. 나는 그것이 지루하고, 다른 파일의 엔트리들 사이에 라인 갭이 있다면 원하는 출력을 얻는 것이 더 쉬울 것이라고 생각한다.

+0

@ 조금 남았습니다. –

답변

6

awk는 그것을 할 수 :

awk '{if(NR > 1 && $2 != prev_two){printf "\n";} prev_two=$2; print $0}' A 

A 파일 이름 인. 당신을 위해

awk 'BEGIN{file=0}{if (file && file!=$2) {print ""} print $0; file=$2}' fileA 
+1

내게있어, awk의'if' 문은 C와 비슷하다.'awk 'prev! = $ 2 {print ""} {print; prev = $ 2} 'filename' –

1

당신은 awk는 사용할 수 있습니다

$lastfile = ''; 
while (<>) { 
    @line = split(/\s+/); 
    $filename = $line[1]; 
    print "\n" unless ($lastfile eq $filename); 
    $lastfile = $filename; 
    print; 
} 

사용법 : perl script.pl <original_file.txt> newfile.txt

0

신속하고 더러운 펄 :

+0

더 빠르고 더 진한 : $ F [1] eq $ prev가 아니라면'perl -lape'print ""; $ prev = $ F [1] '파일' –

0

는 AWK와 펄 솔루션을하는 GNU sed를 솔루션에 추가하려면 :

$ sed -r 'N;/file_name(\w+).*\n.*file_name\1/!{s/\n/&\n/;P;s/^[^\n]*\n//};P;D' infile 
1 file_name1 code_line1 

2 file_name2 code_line2 
2 file_name2 code_line3 

2 file_name3 code_line4 
2 file_name3 code_line5 

3 file_name4 code_line6 
3 file_name4 code_line7 
3 file_name4 code_line8 

설명 :

N # Append next line to pattern space 

# If the numbers after the 'file_name' string DON'T match, then 
/file_name(\w+).*\n.*file_name\1/! { 
    s/\n/&\n/  # Insert extra newline 
    P    # Print up to first newline 
    s/^[^\n]*\n// # Remove first line in pattern space 
} 
P # Print up to newline - if we added the extra newline, this prints the empty line 
D # Delete up to newline, start new cycle