在不同组的行之间添加空行

时间:2010-12-07 18:51:37

标签: linux shell scripting sed awk

我有一个表格的文件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

我希望输出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包含文件中的文件名和代码行,第一个字段是频率,即文件中的代码行数。

我应该明智地浏览这些代码行文件。我发现它很乏味,如果不同文件的条目之间存在线间距,那么对我来说会更容易,因此需要输出。

4 个答案:

答案 0 :(得分:6)

Awk可以做到:

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

A是文件名。

答案 1 :(得分:1)

您可以使用Awk:

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

答案 2 :(得分:0)

快速而肮脏的Perl适合你:

$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

答案 3 :(得分:0)

要添加到awk和Perl解决方案,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