如何用任意两个匹配的数字或第一个数字比第二个数字小一个的字符串?

如何用任意两个匹配的数字或第一个数字比第二个数字小一个的字符串?

我有一个包含四列的制表符分隔文件。我想 grep 查找第 1 列中具有特定模式的行,其中显示 apple中号。我只想提取第一个数字与第二个数字匹配的行,或者第一个数字比第二个数字小一的行。在下面的示例中,第 2、3 和 5 行(不包括标题行)符合该模式。

Col1                               col2   col3   col4
apple (XY_012345, apple 6 of 10)    1    12228  12612
apple (XY_678901, apple 5 of 6)     1    12722  13220
apple (XY_234567, apple 2 of 2)     1    18437  24737
apple (XY_890123, apple 8 of 30)    1    24892  29269
apple (XY_456789, apple 12 of 12)   1    35175  35276

答案1

GNU awk 中类似的事情:

$ gawk 'match($0, /([0-9]+) of ([0-9]+)/, a) && (a[2] == a[1] || a[2] == a[1]+1)' file
apple (XY_678901, apple 5 of 6)     1    12722  13220
apple (XY_234567, apple 2 of 2)     1    18437  24737
apple (XY_456789, apple 12 of 12)   1    35175  35276

答案2

perl -ne 'print if /(\d+) of (\d+)/ && ($1 == $2 or $1 == ($2 - 1))' < input

这是一个“单行”perl 脚本,它循环输入您提供的输入并仅在以下情况下打印行:

  • 匹配并捕获由文本“ of”分隔的两个数字后,
  • 第一个数字等于第二个数字或比第二个数字小一个

相关内容