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