使用 uniq -f 1 會產生意想不到的結果

使用 uniq -f 1 會產生意想不到的結果

在 ubuntuforums.org 上提出問題但沒有得到滿意的答案後,我決定在 Ask Ubuntu 上再次提出這個問題。我需要非常詳細的答案。具體來說,我需要知道哪個行進行比較每次對於以下兩個範例,使用 uniq 列印一行:

文件1.txt:

$ cat -A file1.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
b$

$ sort file1.txt | uniq -f 1
A
aaa    upc
aaa    ztp
b

和文件2.txt:

$ cat -A file2.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
bbb^Ixpz$

$ sort file2.txt | uniq -f 1
A
aaa    upc
aaa    ztp
b
bbb    xpz
c

我對第二個例子感到困惑。我不明白為什麼大寫 B 沒有出現在最終輸出。鑑於行Bbbb xpz彼此相鄰,是否應該列印大寫 B 的行?如果:

B ---> (empty)

bbb ---> xpz

空值並且xpz都是唯一的,因此應該列印這兩行。還是我錯過了什麼?

答案1

答案在於排序順序以及使用時存在uniq小於給定欄位編號 ( N)的欄位值-f N

如所見,您有 ASCII 字元集,因此排序順序是可以預測的:

% sort file.txt            
A
aaa upc
aaa ztp
b
b
B
B
bbb xpz
c
c
C

現在,讓我們uniq -f 1在檢查時跳過每行的(空格分隔的)第一個欄位來取得唯一的行:

% sort file.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c

現在,需要注意的重要一點是,uniq對於少於所提到欄位的行使用空字串,在本例中為 1;因此,與具有 >=2 個欄位的其他行進行比較時,所有僅具有一個欄位的行將被視為其他欄位具有空字串。

所以,從sort file2.txt輸出來看:

b
b
B
B

都將被視為相同,並且僅包含的第一行將被保留,因此輸出中b有 a 。b

同樣,來自:

c
c
C

只有第一個c會出現在uniq的輸出。

答案2

下面的表格可以幫助您完成整個過程:

----------------+---------------+----------+----------------+
    sort        |     Remove    | Adjacent |                |
 (C locale)     |    field #1   |  match?  |    Output      |
----------------+---------------+----------+----------------+
A               |               |    N*    |A               |
B               |               |    Y     |                |
B               |               |    Y     |                |
C               |               |    Y     |                |
aaa     upc     |   upc         |    N     |aaa     upc     |
aaa     ztp     |   ztp         |    N     |aaa     ztp     |
b               |               |    N     |b               |
b               |               |    Y     |                |
bbb     xpz     |   xpz         |    N     |bbb     xpz     |
c               |               |    N     |c               |
c               |               |    Y     |                |
----------------+---------------+----------+----------------+
* the first line has no adjacent above, so is always output

相關內容