2012-10-13 45 views
1

我有一個正則表達式的例子:AWK-字符串表達式

seq 20 | awk 'NR!~/^2$|^12$|^15$/' 

相同,但與鏈表達:

seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"' 

是否可以寫短字符串表達式?

seq 20 | awk 'NR != "2" | "12" | "15" ' 

謝謝你的解釋。

回答

2

不是我所知。就像你暗示的那樣,如果你想以這種方式進行平等測試(或者在這種情況下是不平等測試),你將需要使用正則表達式。

如果您有多個要忽略的值,請考慮在BEGIN塊中使用數組。這將使表達更短(即表達現在簡單:!(NR in array))時awk遍歷各行:

seq 20 | awk 'BEGIN { array[2]++; array[12]++; array[15]++ } !(NR in array)' 

結果:

1 
3 
4 
5 
6 
7 
8 
9 
10 
11 
13 
14 
16 
17 
18 
19 
20 

如果你有某種圖案線條你試圖忽略,考慮在BEGIN塊使用for循環:

seq 20 | awk 'BEGIN { for (i=1; i<=15; i++) array[i]++ } !(NR in array)' 

16 
17 
18 
19 
20 
+0

我認爲OP希望該行數不與2結尾的所有行,12,15,好了,以次20威力是個壞榜樣。嘗試seq 200或seq 1000.你的第一個解決方案將打印102行嗎? – Kent

+0

@Kent:我想他只是想找一個較短的表達。我不認爲他在試圖找到不以2,12或15結尾的行。重新閱讀這個問題可能是值得的:-) – Steve

+0

@steve,謝謝你的一個很好的例子。 – Tedee12345

1

的第一種可能是最短的,這將是更短,如果你離開一組()外錨:

seq 20 | awk 'NR !~ /^(2|12|15)$/' 
+0

謝謝你的一個很好的例子。 – Tedee12345

相關問題