2017-02-17 59 views
0

對於數據集:如果條件爲一,我該如何讓nawk逃避兩個?

12345 78945 
12345 45678 

我需要的輸出爲

12345 45678 

長話短說,有時兩個值是代表相同的對象,由於我上面的薪酬等級制定的某些做法。因此,使用表示相同對象的已知值對的列表,我需要awk從輸出中過濾這些值。在上述情況下,12345和78945表示相同的對象,所以應該將其過濾掉。剩下的行是應引起我注意的錯誤。

我試圖代碼

cat data | nawk '(($1!="12345")&&($2!="78945"))' 

產生一個空集作爲輸出。因此,無論我在腦海中是否犯了一個邏輯錯誤,或者是一個句法錯誤,nawk都會單獨評估每個條件,就好像寫成cat data | nawk '($1!="12345")&&($2!="78945")'一樣,從而過濾出兩者,因爲兩者都不符合第一個條件。

我敢肯定這只是我對nawk如何解決這些問題不熟悉。預先感謝您的幫助。由於原因,這必須在nawk中完成。

+1

另外:'nawk'是一個在不同平臺上具有不同含義的抽象概念。最好提一下具體的Awk實現。 – mklement0

+0

wrt'因爲原因,這必須在nawk完成。' - 什麼原因?如果是因爲你在Solaris上 - 不要使用nawk,而它比/ bin/awk(又名舊的,破解的awk)功能更強大,nawk本身是過時的,並且是POSIX之前的版本。改用/ usr/xpg4/bin/awk。 –

+0

感謝您的提示。我將來會記住這一點。 –

回答

4

您的樣本數據中沒有任何一行$1!="12345"爲真,因此沒有其他條件可以成立。想想看。這與awk無關 - 這是簡單的布爾邏輯。

嘗試任何這些替代,無論你的感覺是更加清晰:

nawk '($1!="12345") || ($2!="78945")' data 
nawk '!(($1=="12345") && ($2=="78945"))' data 
nawk '($1=="12345") && ($2=="78945"){next} 1' data 
nawk '($1" "$2) != "12345 78945"' data 
nawk '!/^[ \t]*12345[ \t]+78945([ \t+]|$)/' data 

也是谷歌UUOC明白,爲什麼我擺脫cat data |

+1

因此,一個邏輯錯誤,然後,哈哈。我看了一會兒,出於某種原因,從來沒有得出這樣明顯的結論。我想在我的腦海裏,我正在想'nawk'!(($ 1 ==「12345」)&&($ 2 ==「78945」))'data',但最終我輸入了我所做的,就好像它們是相同的。當然明顯的選擇是||在那裏我只需要其中一個條件是錯誤的知道輸出行。謝謝。 –