Linux

如何用任何兩個數字匹配或第一個數字比第二個數字小一個的字元串?

  • June 26, 2019

我有一個包含四列的製表符分隔文件。我想在第 1 列中查找具有特定模式的行,其中顯示 apple M of N。我只想提取第一個數字與第二個數字匹配的行,或者第一個數字小於第二個數字的行。在下面的範例中,第 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

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
perl -ne 'print if /(\d+) of (\d+)/ && ($1 == $2 or $1 == ($2 - 1))' < input

這是一個“單線” perl 腳本,它循環遍歷您給它的輸入並僅在以下情況下列印行:

  • 在匹配並擷取由文本“”分隔的兩位數字之後of
  • 第一個數字等於第二個數字或比第二個數字小一

引用自:https://unix.stackexchange.com/questions/527060