在 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 沒有出現在最終輸出。鑑於行B
和bbb 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