破译正则表达式

时间:2013-08-16 07:02:14

标签: regex awk

请帮我解读正则表达式 -

'!_[$0]++'

它用于从以下用法获取MSISDN(从包含MSISDN列表的文件开始一次一个):

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

3 个答案:

答案 0 :(得分:6)

它不是正则表达式,它是算术和布尔表达式。

  • $0 =当前输入行
  • _[$0] =一个关联数组元素,其键是输入行
  • _[$0]++ =每次遇到重复行时都会增加该数组元素,但计算结果为原始值
  • !_[$0]++ =布尔反转,因此如果值最初为0或空字符串则返回true,否则返回false

所以这个表达式在第一次遇到一行时是真的,每隔一次都是假的。由于表达式后没有动作块,默认情况下是在表达式为true时打印行,在false时跳过它。

因此,这会打印输入文件,并省略重复项。

答案 1 :(得分: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.

因此不会打印所有重复的行。

答案 2 :(得分:1)

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

_在此处用作数组,$0表示整行。假设数组元素的默认数值是0(它在技术上是一个空字符串,但在数字上下文中它被视为0),第一次看到一行时,就会打印该行(从{{1}开始)是假的,_[$0]将是真的。每次看到一行时该命令都会递增(打印后 - awk的默认命令是打印),因此下次当您看到!_[$0]行将_[$0]并且不会打印该行时< / p>