Add blank line between lines from different groups

后端 未结 4 1190
无人及你
无人及你 2020-12-21 09:59

I have a file A of the form (frequency,file name,code lines):

1 file_name1 code_line1
2 file_name2 code_line2
2 file_name2 code_line3
2 file_nam         


        
相关标签:
4条回答
  • 2020-12-21 10:04

    Awk could do it:

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

    A being the file name.

    0 讨论(0)
  • 2020-12-21 10:06

    Quick and dirty Perl for you:

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

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

    0 讨论(0)
  • 2020-12-21 10:09

    To add to the awk and Perl solutions, a GNU sed solution:

    $ 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
    

    Explained:

    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
    
    0 讨论(0)
  • 2020-12-21 10:25

    You can use Awk:

    awk 'BEGIN{file=0}{if (file && file!=$2) {print ""} print $0; file=$2}' fileA
    
    0 讨论(0)
提交回复
热议问题