我的輸入文件是這樣的。根據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列頂部的值)。 ..
我的輸入文件是這樣的。根據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列頂部的值)。 ..
您可以使用簡單的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
(如.
或[
),則需要注意。
隨着的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
哦,很棒的radoulov ....謝謝你......但是我可以在awk或sed中獲得相同的更多記錄嗎? – aln
你可以嘗試這樣:'sort -t,-k1,2 -k3nr infile | awk -F,'_ [$ 1,$ 2] ++ <3'' –
喜PAX ... ...優異的我們的代碼是偉大的工作......但是當我應用相同的邏輯來設置沒有大的。的記錄,劇本掛出說沒有記憶......任何其他的選擇? – aln
@ain:'sed's /,[^,] * $ /,/ infile | sort -u |同時讀取密鑰;做grep「^ $ key」infile | sort -r |頭-3; done'。請注意,對於大量的記錄,while循環中的處理將是s..l ... o .... w! –
@aln,這取決於問題出在哪裏。文件中有多少行(使用'wc -l infile')?多少個唯一鍵(使用'sed's /,[^,] * $ /,/'infile | sort -u | wc -l')? – paxdiablo