2014-04-03 90 views
7

如下表如何刪除基於列值的重複行?

123456.451 entered-auto_attendant 
123456.451 duration:76 real:76 
139651.526 entered-auto_attendant 
139651.526 duration:62 real:62` 
139382.537 entered-auto_attendant 

使用基於Linux中一個bash shell腳本,我想刪除基於列1(一個與長數)的值的所有行。有考慮到這個數字是一個可變數量

我已經與

awk '{a[$3]++}!(a[$3]-1)' file

sort -u | uniq 

試過,但我沒有得到這會是這樣的結果,讓所有的比較第一列的值,刪除所有的副本,並顯示

123456.451 entered-auto_attendant 
139651.526 entered-auto_attendant 
139382.537 entered-auto_attendant 

回答

6

你沒有給預期的輸出,這是否對你的工作?

awk '!a[$1]++' file 

與您的數據,輸出爲:

123456.451 entered-auto_attendant 
139651.526 entered-auto_attendant 
139382.537 entered-auto_attendant 

和此行只打印獨特的列1行:

awk '{a[$1]++;b[$1]=$0}END{for(x in a)if(a[x]==1)print b[x]}' file 

輸出:

139382.537 entered-auto_attendant 
+0

1:次要錯字 - 'B [$ 1]'應'B [X]'在'END'塊。 –

+0

它是一個錯字,THX,固定 – Kent

+0

什麼,如果我需要所有以139382.537開始列(在這種情況下) – user3494949

1

用awk:

awk '!($1 in a){a[$1]++; next} $1 in a' file 
123456.451 duration:76 real:76 
139651.526 duration:62 real:62 
+0

好,但我想都具有相同列開始,像描述中的記錄,在這種情況下是2條記錄與同第一列,但有時可能是三個以上 – user3494949

+0

難道不是這是什麼答案已經在做。它正在打印所有重複的行。你的預期產出是多少? – anubhava

2

uniq,默認情況下,比較整條線。由於你的線條不相同,它們不會被刪除。

您可以使用sort來排序方便第一場,也刪除它的副本:

sort -t ' ' -k 1,1 -u file 
  • -t ' '字段用空格
  • 分離
  • -k 1,1:只能看第一場
  • -u:刪除重複

此外,你可能已經看到了awk '!a[$0]++'伎倆重複數據刪除線。您只能使用awk '!a[$1]++'在第一列進行重複數據刪除。

1

試試這個命令

awk '!x[$1]++ { print $1, $2 }' file