Text-Processing
困難的 grep。我怎樣才能隔離這個號碼?
我有這個文件內容:
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
或使用
grep
andsed
: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
) 和第一個欄位,但如果您不想要行號,可以很容易地刪除它。