2010-11-22 74 views
2

uniq的字符串,請採用以下 所有我想要的是得到從文件中NODE_NAME串並執行uniq的,如果他們平等的uniq +沒有得到文件

但在下面的例子中得到uniq的字符串看看我有兩個相等的行(node_name moon1)

但爲什麼uniq命令不會將它減少到一行? ,我真的不明白這是爲什麼?

sed s'/=/ /'g file| awk -v WORD=node_name '$2 == WORD {print $0}' | awk '{print $2" "$3}' | sort | uniq 

node_name moon1 
node_name moon1 

文件:

. 
    . 

/home/home1/home2/config1/COMPANY/my.config  node_name=moon1 
/home/home1/home2/config1/MEAS2XML/my.config.tmp node_name=moon1 

    . 
    . 
+1

工作正常,我的 'x [$ 0] ++!':http://www.ideone.com/ HYkDH – codaddict 2010-11-22 16:47:43

+0

該文件有超過1000行,這兩行是大文件的一部分 – jon 2010-11-22 16:49:33

+0

嗨我發現^ M後moon1 - 請建議如何刪除此 – jon 2010-11-22 16:56:55

回答

5

有用於uniq的兩個主要原因未能合併相同的線路:

  • 的線是不是真的一樣 - 額外的尾隨空白是這裏的常規疑似。 awk命令應該過濾這個例子中的那些命令,但是無論如何你都可以檢查它。混合線路終端也是一個可能的原因。

  • 行不相鄰 - 如果語言環境設置不正確,排序可以並且不能正確排列行。我有看到奇怪的情況與非ASCII文本,其中相同的行不會一個接一個地結束。在uniq命令之前檢查sort的輸出。你的區域設置是什麼?

順便說一句,'sort -u'是'sort | uniq的」。

編輯:

好像一個或兩個問題:

  • 你混行終止。如果你的一些行以LF(\ n,Unix風格的終結符)和CR/LF(\ r \ n,DOS風格的終結符)結束,uniq會將它們視爲不同的行,即使它們在其他方面是相同的。

  • 在CR/LF DOS風格的行結束符的某些行中的尾隨空格。 CR(Carriage return,'\ r')字符不被大多數(所有?)unix實用程序認爲是空白的,包括awk。如果其中一行沒有任何其他尾隨空格,則CR將被視爲其最後一個字段的一部分並被打印出來。另一方面,在最後一個字段和CR之間的空白行中,awk打印的最後一個字段不包含CR。

改變CR/LF行結束LF將解決這兩個問題在這種情況下,儘管一般最好以過濾前後的空白字符,以及:

  • DOS2UNIX的是優選的方式
  • 作爲一個替代方案,通過過濾您的文件sed 's|\r$||'
1

聽起來像是你在你的文件雜散字符。先用清潔:

dos2unix your_file 

此外,無關你的問題,但你可以簡單地替換sort -usort | uniq

0

我還沒有嘗試過您的問題中指定的命令,但運行以下代替:

貓富|切-d \ = -f 2 |排序| uniq的

其中 「富」 是包含2線在您的示例文件。 上面的輸出是「moon1」。

比你的例子更簡單,因爲我假設每行只有一個'name = value'對;我對你的文件格式一無所知。

希望這有助於反正...

0

我經歷了類似的問題,但除了刪除重複的線路,我想,以確保線路的順序也保持不變。結合uniq和排序打敗了這個目的。

幸運的是AWK提供瞭解決方案

$ AWK FILENAME.TXT

awk and duplicate lines