亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從文件中獲取第n行的Bash工具

從文件中獲取第n行的Bash工具

翻閱古今 2019-07-08 15:01:30
從文件中獲取第n行的Bash工具有什么“規范”的方法嗎?我一直在用head -n | tail -1但我一直在想,是否有一個專門從文件中提取一行(或一系列行)的Bash工具。所謂“規范”,我指的是一個程序,它的主要功能就是這樣做。
查看完整描述

3 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

head和煙斗tail對于一個龐大的文件來說會很慢。我建議sed就像這樣:

sed 'NUMq;d' file

哪里NUM要打印的行號;因此,例如,sed '10q;d' file的第10行file.

說明:

NUMq將在行號為NUM.

d將刪除該行,而不是打印它;這將在最后一行上被禁止,因為q導致退出時跳過腳本的其余部分。

如果你有NUM在變量中,您需要使用雙引號而不是單引號:

sed "${NUM}q;d" file


查看完整回答
反對 回復 2019-07-08
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

我有一個獨特的情況,我可以基準的解決方案在這一頁,所以我寫這個答案,作為對建議的解決方案與每個包含的運行時間的整合。

設置

我有一個3.261 GB的ASCII文本文件,每一行只有一個鍵值對。該文件總共包含3,339,550,320行,并且無法在我嘗試過的任何編輯器中打開,包括我的Go-to Vim。我需要對這個文件進行子集,以便研究我所發現的一些值,這些值僅從500,000,000行左右開始。

因為文件有這么多行:

  • 我只需要提取行的一個子集就可以對數據做任何有用的事情。
  • 閱讀每一行,直到我關心的值,將需要很長的時間。
  • 如果解決方案讀取了我關心的行,并繼續讀取文件的其余部分,那么它將浪費時間讀取將近30億個不相關的行,并且花費比需要長6倍的時間。

我最好的解決方案是只從文件中提取一行,而不讀取文件中的任何其他行,但我想不出如何在Bash中實現這一點。

為了我的理智,我不會試圖閱讀我自己的問題所需要的全部5億行。相反,我將嘗試從3,339,550,320行中提取第50,000,000行(這意味著讀取完整文件所需的時間將比需要長60倍)。

我將使用time內置以對每個命令進行基準測試。

基線

首先讓我們看看head tail解決辦法:

$ time head -50000000 myfile.ascii | tail -1pgm_icnt = 0real    1m15.321s

第五千萬行的基線是00:01:15.321,如果我直接用五億行的話,大概是12.5分鐘。

我對這件事很懷疑,但值得一試:

$ time cut -f50000000 -d$'\n' myfile.ascii
pgm_icnt = 0real    5m12.156s

這一次花了00:05:12.156才運行,這比基線慢得多!我不確定它是讀取了整個文件,還是在停止之前只讀取了5000萬行,但無論如何,這似乎并不是解決問題的可行方法。

AWK

我只使用exit因為我不打算等待完整的文件運行:

$ time awk 'NR == 50000000 {print; exit}' myfile.ascii
pgm_icnt = 0real    1m16.583s

該代碼在00:01:16.583中運行,這只比基線慢了1秒,但仍然沒有對基線進行改進。按照這種速度,如果退出命令被排除在外,那么讀取整個文件可能需要大約76分鐘的時間!

Perl

我還運行了現有的Perl解決方案:

$ time perl -wnl -e '$.== 50000000 && print && exit;' myfile.ascii
pgm_icnt = 0real    1m13.146s

該代碼運行于00:01:13.146,比基線快了2秒。如果我用5億英鎊運行,大概要花12分鐘。

SED

最重要的答案是,這是我的結果:

$ time sed "50000000q;d" myfile.ascii
pgm_icnt = 0real    1m12.705s

該代碼運行于00:01:12.705,比基線快3秒,比perl快0.4秒。如果我在完整的500,000,000行上運行它,可能需要12分鐘。

地圖檔

我有bash3.1,因此不能測試mapfile解決方案。

結語

看起來,在大多數情況下,很難在head tail解決辦法。充其量sed解決方案提高了大約3%的效率。

(按公式計算的百分比)% = (runtime/baseline - 1) * 100)

第50,000,000行

  1. 00:01:12.705 (-00:00:02.616 = -3.47%) sed

  2. 00:01:13.146 (-00:00:02.175 = -2.89%) perl

  3. 00:01:15.321 (+00:00:00.000 = +0.00%) head|tail

  4. 00:01:16.583 (+00:00:01.262 = +1.68%) awk

  5. 00:05:12.156 (+00:03:56.835 = +314.43%) cut

第500,000,000行

  1. 00:12:07.050 (-00:00:26.160) sed

  2. 00:12:11.460 (-00:00:21.750) perl

  3. 00:12:33.210 (+00:00:00.000) head|tail

  4. 00:12:45.830 (+00:00:12.620) awk

  5. 00:52:01.560 (+00:40:31.650) cut

第3,338,559,320行

  1. 01:20:54.599 (-00:03:05.327) sed

  2. 01:21:24.045 (-00:02:25.227) perl

  3. 01:23:49.273 (+00:00:00.000) head|tail

  4. 01:25:13.548 (+00:02:35.735) awk

  5. 05:47:23.026 (+04:24:26.246) cut


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 734 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號