Text-Processing

困難的 grep。我怎樣才能隔離這個號碼?

  • July 26, 2018

我有這個文件內容:

 63 41,3,11,12 
 1 31,60,72,96 
 7 41,3,31,14,15,68,59,60 
 7 60,72,96 
 7 60 
 1 41,3,31,31,14,15,68,59,60 
 60 41,3,115,12,13,66,96 
 1 41,3,11,12,13,66,96 

我需要在'60’之前grep'7’(其中'60’後面沒有'72,96’)。

根據評論修改範例

$ cat ip.txt
 7 60,72,96 
 7 60 
3 601
2 60,72,962
5 60,3
43 60   
3 52360

$ grep -oP '^\h*\K\d+(?=\h+60\h*$)' ip.txt 
7
43
  • -oP僅列印匹配部分,使用 PCRE
  • ^\h*\K忽略行的起始空白字元
  • \d+要列印的數字
  • (?=\h+60\h*$)僅當它後跟空白字元,然後是60可選的空白,直到行尾

或者,僅awk用於基於欄位的處理;)

僅將第一個欄位從第二個欄位所在的行中取出60(應該適用於任何 awk,而不僅僅是 GNU awk):

awk '$2 == "60" {print $1}' < file 

或使用grepand sed

grep -E '^[[:space:]]*[[:digit:]]+[[:space:]]+60[[:space:]]*$' < file |
  sed -e 's/^[[:space:]]*//' -e 's/[[:space:]].*//'

awk 中的一個醜陋的單線,用於一般情況下,您希望使用線60但要排除那些也有對的線72,96

awk 'function f(n) { return ($2 ~ "(^|,)" n "(,|$)") }
    f(60) && ! (f(72) && f(96)) {print NR, $1}' < file 

該函式f(n)檢查是否n在第二個欄位的數字列表中(假設數字用逗號或欄位的開頭/結尾分隔)。然後我們只檢查它60是否存在,而這對72,96不存在。輸出是行號 ( NR) 和第一個欄位,但如果您不想要行號,可以很容易地刪除它。

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