2013-08-16 167 views
3

请帮我破译定期expression-破译正则表达式

'!_[$0]++' 

它正在使用的(同时含有从零开始MSISDN的列表的文件一次一个)由以下使用获得MSISDN :

awk '!_[$0]++' file.txt 
+0

这不是一个正则表达式,正则表达式在'/.../'里面。这只是一个包含数组和运算符的普通表达式。 – Barmar

+0

为了记录,如果它实际上是一个正则表达式,它将名义上包含一个语法错误,因为在awk正则表达式中不能有两个'+'量化器。忽略 - 例如'mawk'和'nawk'实际上是这样的! - 它可以匹配任何包含文字字符“!_”的任何行,后面跟随一个或多个出现字符“$”或“0”的字符(即可以是$$$$或0000)或'$'或'0'或'$ 00 $$$ 0 $'等)。 awk脚本是'awk'/!_ [$ 0] + /'file.txt' - 注意表达式的斜杠,使其成为正则表达式测试。 – tripleee

回答

6

这不是正则表达式,这是一个算术和布尔表达式。

  • $0 =电流输入线
  • _[$0] =关联数组元素,其键是输入线
  • _[$0]++ =数组元素每次我们遇到的线的重复,但计算结果为增量原始值
  • !_[$0]++ =布尔逆,所以如果该值最初是0或空字符串,它返回真,假否则

所以这个表达式在遇到第一次时是真实的,每隔一段时间都是假的。由于表达式后没有任何动作块,因此默认情况下,如果表达式为true,则打印行,并在false时跳过。

所以这打印输入文件重复省略。

1
'true'- then the line will be printed 

'_[$0]++'- associative array will be incremented everytime when $0 is present.means it will set the number of times each line is repeated. 

'!_[$0]++'-this will be true when a line is inserted in the associative array for the firsttime only and the rest of the times it will resolve to false ultimately not printing the line. 

因此,所有的重复行不会被prited。

1

这不是一个正则表达式。第一次找到这个特定命令时会打印出唯一的行。

_在这里被用作数组,而$0指的是整条线。假设数组元素的默认数值是0(技术上它是一个空字符串,但在数字上下文中它被视为0),您第一次看到一条线时,将打印该行(因为_[$0]是虚假的,!_[$0]将为真)。该命令每次看到一行时都会递增(打印后 - awk的默认命令是打印),因此下次您看到行_[$0]将是1并且行将不会被打印