Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在不同组的行之间添加空行_Linux_Shell_Scripting_Sed_Awk - Fatal编程技术网

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

Linux 在不同组的行之间添加空行,linux,shell,scripting,sed,awk,Linux,Shell,Scripting,Sed,Awk,我有一个a格式的文件(频率、文件名、代码行): 我希望输出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包含文件名和文件中的代码行,

我有一个
a
格式的文件(频率、文件名、代码行):

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

我应该按文件顺序浏览这些代码行。我发现它很乏味,如果不同文件的条目之间有行距,那么我会更容易获得所需的输出。

Awk可以做到:

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

您可以使用Awk:

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

快速而肮脏的Perl:

$lastfile = '';
while (<>) {
  @line = split(/\s+/);
  $filename = $line[1];
  print "\n" unless ($lastfile eq $filename);
  $lastfile = $filename;
  print;
}
$lastfile='';
而(){
@行=拆分(/\s+/);
$filename=$line[1];
打印“\n”,除非($lastfile eq$filename);
$lastfile=$filename;
印刷品;
}

用法:
perl script.plnewfile.txt

要向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

更快更脏:
perl-lape“print”,除非$F[1]eq$prev$prev=$F[1]'文件
对于我来说,如果awk中的语句太像C:
awk'prev!=$2{print”“}{print;prev=$2}文件名
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