Linux 条件行编号

Linux 条件行编号,linux,awk,text-processing,Linux,Awk,Text Processing,我试图在文件中的每一行之前都加上数字,但前提是第二列(字段)中的值不同于前面的值 输入文件: 11:10PM *Jane> login 11:15PM *Bob> login 11:16PM *Bob> logout 11:45PM *Betty> login 01:20AM *John> login 输出: 1. 11:10PM *Jane> login 2. 11:15PM *Bob> login 11:16PM *Bob>

我试图在文件中的每一行之前都加上数字,但前提是第二列(字段)中的值不同于前面的值

输入文件:

11:10PM *Jane> login
11:15PM *Bob>  login
11:16PM *Bob>  logout
11:45PM *Betty> login
01:20AM *John>  login
输出:

1. 11:10PM *Jane> login
2. 11:15PM *Bob>  login
   11:16PM *Bob>  logout
3. 11:45PM *Betty> login
4. 01:20AM *John> login

利用变量在awk中具有默认值这一事实:

{
  if (last == $2) {
    printf("    %s\n", $0)
  } else {
    n += 1;
    last = $2;
    printf("%2d. %s\n", n, $0);
  }
}

这使用n来记住看到了多少条记录,并使用last来记住看到的最后一条记录。

利用变量在awk中具有默认值这一事实:

{
  if (last == $2) {
    printf("    %s\n", $0)
  } else {
    n += 1;
    last = $2;
    printf("%2d. %s\n", n, $0);
  }
}
$ awk '{print (seen[$2]++ ? "   " : sprintf("%2d.",++cnt)), $0}' file
 1. 11:10PM *Jane> login
 2. 11:15PM *Bob>  login
    11:16PM *Bob>  logout
 3. 11:45PM *Betty> login
 4. 01:20AM *John>  login

这使用n来记住看到了多少个条目,最后一个用来记住看到的最后一个条目。

您能解释一下它背后的逻辑吗?像往常一样干净、聪明!)@Sadhun给出了你最近的评论,要求对我的一些琐碎的回答进行解释,你需要阅读Arnold Robbins的《有效的Awk编程》,第四版。这比我一个脚本一个脚本地解释awk是如何工作的要有效得多。你能解释一下它背后的逻辑吗?像往常一样干净聪明!)@Sadhun给出了你最近的评论,要求对我的一些琐碎的回答进行解释,你需要阅读Arnold Robbins的《有效的Awk编程》,第四版。这比我一个脚本一个脚本地解释awk的工作原理要有效得多。
$ awk '{print (seen[$2]++ ? "   " : sprintf("%2d.",++cnt)), $0}' file
 1. 11:10PM *Jane> login
 2. 11:15PM *Bob>  login
    11:16PM *Bob>  logout
 3. 11:45PM *Betty> login
 4. 01:20AM *John>  login