2016-09-20 34 views
1

我有一個包含多列的測試文件。我想根據包含數值的第8列進行排序,然後抓取前10%的行並將它們導出到新文件。如何抓取文本文件中第一個10%的行?

我寧願在bash中這樣做。我知道我可以對sort進行排序-k8 -n,但是我一直無法完成第二項任務。

對於輸出:

如果我的文本文件中有1000行,我只希望在第一100

文件是製表符分隔。

謝謝!

+0

你試過用谷歌尋找什麼?似乎你需要使用搜索條件「bash獲取第一行文件」,「bash在文件中計數行數」,「bash除整數」 – activedecay

+0

如果你知道你需要的行數(目前爲100行),那麼爲什麼不簡單地使用:'head -n 100'? –

+0

我已經試過看各種谷歌搜索。有很多方法可以抓取前N行,但我需要前N行。 @KristoMägi這是一個例子,我的管道運行數百個樣本,併爲每個樣本調用「綁定網站」,並且數字總是大不相同,這就是爲什麼我想要獲得前10%的原因。 – System

回答

2

如果你能適應在內存中的整個文件,那麼你可以將輸出發送到AWK:

sort -nk8 file | awk '{ a[NR] = $0 } END { 
    for (i = 1; i <= NR/10; ++i) print a[i] 
}' 

每一行保存在陣列a,由行號索引英寸第一行NR/10行被打印。

如果你有GNU awk的,你甚至可以做排序的同時:由數

awk '{ a[NR] = $0 } END { 
    asort(a, b, "@val_num_asc"); for (i = 1; i <= NR/10; ++i) print b[i] 
}' file 

一旦所有的(未分類)線被讀取,asort按升序排序。

另一種方法是輸出的sort結果到一個文件,然後使用這樣的事情:

head -n $(($(wc -l < file)/10)) file 

記住,外殼算術是整數而已,所以如果你在你的文件1009線這將只輸出100.

+0

這兩個工作都很完美,謝謝!我知道必須有一種方法可以將wc -l/10公式轉換爲頭部選項,但我根本找不到如何。謝謝! – System

相關問題