解释awk代码

A Q*_*A Q 3 awk

代码用于从包含命令行历史记录的 histroy.txt 文件中删除重复条目。

BEGIN{
      if (data[$0]++ == 0)
         lines[++count] = $0;
     }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }
Run Code Online (Sandbox Code Playgroud)

data代码中有什么以及为什么要与它进行比较0

Arc*_*mar 5

这个意图记住输入中的 uniq 行。

正如 Jeff Schaller 指出的那样,$0BEGIN块中是未定义的。

一个更正确的代码应该是

{
      if (data[$0]++ == 0)
         lines[++count] = $0;
     }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }
Run Code Online (Sandbox Code Playgroud)

甚至

!data[$0]++ { lines[++count] = $0; }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }
Run Code Online (Sandbox Code Playgroud)

第一次出现的data[$0]行将等于 0 并line[ ]接收该行。

测试后,data[$0]将被增量(++是一个后增量)并且测试将评估为假对于具有相同内容的行。

END语句按顺序打印所有行。

另请参阅awk '!a[$0]++' 如何工作?