2010-12-07 53 views
3

J'ai un fichier A de la forme (fréquence, nom de fichier, les lignes de code):Ajouter une ligne vide entre les lignes de différents groupes

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 

Je veux sortie B comme:

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 

Fondamentalement le fichier A contient le nom de fichier et les lignes de code du fichier et le premier champ est la fréquence, c'est-à-dire le nombre de lignes de code dans le fichier.

Je suis supposé passer par ces lignes de code. Je trouve cela fastidieux et il serait plus facile pour moi s'il y avait un intervalle de ligne entre les entrées de différents fichiers, d'où la sortie désirée.

+0

@Dave: Un peu plus bas. –

Répondre

6

Awk pouvait le faire:

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

A étant le nom du fichier.

+1

Pour moi, les instructions 'if' dans awk sont trop proches de celles de C:' awk 'prev! = $ 2 {print ""} {print; prev = $ 2} 'filename' –

1

Vous pouvez utiliser awk:

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

rapide et Perl sale pour vous:

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

Utilisation: perl script.pl <original_file.txt> newfile.txt

+0

Plus rapide et plus sale: 'perl -lape 'print" "sauf $ F [1] eq $ prev; $ prev = $ F [1] 'fichier' –

0

Pour ajouter à la awk et des solutions Perl, une solution 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 

Expliqué:

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