在与模式匹配的线上添加行计数器

时间:2013-07-01 08:53:36

标签: linux

我需要在与文件中特定模式匹配的行前面添加行计数器,同时仍然输出与此模式不匹配的行。

例如,如果我的文件如下所示:

aaa 123
bbb 456
aaa 666
ccc 777
bbb 999

我想要计算的模式是'aaa'和'ccc',我想获得以下输出:

1:aaa 123
bbb 456
2:aaa 666
3:ccc 777
bbb 999

最好是我正在寻找一个Linux单线程。只要在大多数发行版中默认安装Shell或工具,它就无关紧要。

2 个答案:

答案 0 :(得分:2)

使用以下代码。 perl

中有以下方法
open FH,"<abc.txt";

$incremental_val = 1;

while(my $line = <FH>){
  chomp($line);

  if($line =~ m/^aaa / || $line =~ m/^ccc /){
    print "$incremental_val : $line\n";
    $incremental_val++;
    next;
  }
  print "$line\n";
}

close FH;

输出如下。

1 : aaa 123
bbb 456
2 : aaa 666
3 : ccc 777
bbb 999

答案 1 :(得分:2)

使用awk

awk '{if ($1=="aaa" || $1=="ccc") {a++; $0=a":"$0}} {print}' file
1: aaa 123
bbb 456
2: aaa 666
3: ccc 777
bbb 999

解释

循环检查第一个字段是aaa还是ccc。如果是,请使用变量$0附加行(a)并自动递增。最后,在所有情况下都打印该行:如果匹配的模式在开头会有a,那么只有原始行。