我有一個5000萬行的文件,我必須隨機輸出1000行。這是用shell打印特定行的最快方法嗎?
首先,我創建了1000個隨機數;那麼我使用
sed -n "$random{p;q}" file
它真的很慢;一行輸出將花費至少5-6秒。
所以我認爲我應該優化打印特定線速度。
我們有很多方法來打印特定行:
sed -n "$line{p;q}" file
awk "NR==$line{print}" file
head -$line file | tail -1
這一切都慢......耗資約5-6秒鐘,以打印特定的行。
shell中是否有其他方式來打印特定的行?或者python,perl可以比shell更快?或者我的方式來解決這個問題錯了?
---------------------------------------- SPLIT ----- -----------------------------------------
迭代1000個隨機數和每次使用shell一次,可能會產生1000次io操作。也許我應該使用一個數組來先保存隨機數並迭代文件一次。
random_array=()
awk '{if (NR in $random_array) print;}' file
好吧,我將測試這種方法和結果粘貼任何後來
我不認爲AWK理解Bash的數組。 – icktoofay
你的要求是什麼?以隨機順序50,000,000行中的1,000行,還是可以按文件中顯示的順序選擇1,000行?無論哪種方式,我可能會使用Perl,並讓它產生範圍爲1..50,000,000的1,000個數字,然後逐行掃描文件(但只有一次,而不是1,000次),打印或保存行對應於所需的行號之一。打印使用較少的內存,但按順序打印行;保存允許您按生成數字的順序打印行。 –
也許「更快」的解決方案而不是「最快」就足夠了?特別是,一個打印1000個隨機行的'sed'腳本將比1000個獨立的'sed'運行快得多。 'sed -n'17p; 42p; 57p; 89 {p; q}'文件' – tripleee