2011-07-12 26 views
1

我的輸入文件是這樣的。根據unix中的密鑰整理選定的記錄

 
01,A,34 
01,A,35 
01,A,36 
01,A,37 
02,A,40 
02,A,41 
02,A,42 
02,A,45 

我的輸出需要基於鍵(第1和第2列)

由於提前

 
01,A,37 
01,A,36 
01,A,35 
02,A,45 
02,A,42 
02,A,41 

即只選擇前三名的記錄(基於第3列頂部的值)。 ..

回答

2

您可以使用簡單的bash腳本來執行此操作,前提是數據如圖所示。

pax$ cat infile 
01,A,34 
01,A,35 
01,A,36 
01,A,37 
02,A,40 
02,A,41 
02,A,42 
02,A,45 

pax$ ./go.sh 
01,A,37 
01,A,36 
01,A,35 
02,A,45 
02,A,42 
02,A,41 

pax$ cat go.sh 
keys=$(sed 's/,[^,]*$/,/' infile | sort -u) 
for key in ${keys} ; do 
    grep "^${key}" infile | sort -r | head -3 
done 

第一行用sed然後分揀輸出,並用sort刪除重複去除最後一列得到充分的密鑰集合,從所述第一兩個字段構成。在這種特殊情況下,密鑰是01,A,02,A,

它的提取物的相關數據爲每個鍵(for環與grep一起),與sort -r降序排列,並用head得到只有前三個(對於每個鍵)排序。

現在,如果您的密鑰可能包含特殊字符grep(如.[),則需要注意。

+0

喜PAX ... ...優異的我們的代碼是偉大的工作......但是當我應用相同的邏輯來設置沒有大的。的記錄,劇本掛出說沒有記憶......任何其他的選擇? – aln

+0

@ain:'sed's /,[^,] * $ /,/ infile | sort -u |同時讀取密鑰;做grep「^ $ key」infile | sort -r |頭-3; done'。請注意,對於大量的記錄,while循環中的處理將是s..l ... o .... w! –

+0

@aln,這取決於問題出在哪裏。文件中有多少行(使用'wc -l infile')?多少個唯一鍵(使用'sed's /,[^,] * $ /,/'infile | sort -u | wc -l')? – paxdiablo

0

隨着的Perl

perl -F, -lane' 
    push @{$_{join ",", @F[0,1]}}, $F[2]; 
    END { 
    for $k (keys %_) { 
     print join ",", $k, $_ 
     for (sort { $b <=> $a } @{$_{$k}})[0..2] 
     } 
    }' infile 
+0

哦,很棒的radoulov ....謝謝你......但是我可以在awk或sed中獲得相同的更多記錄嗎? – aln

+0

你可以嘗試這樣:'sort -t,-k1,2 -k3nr infile | awk -F,'_ [$ 1,$ 2] ++ <3'' –

相關問題