第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

3 回答

?
慕萊塢森

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

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

sed 'NUMq;d' file

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

說明:

NUMq將在行號(hào)為NUM.

d將刪除該行,而不是打印它;這將在最后一行上被禁止,因?yàn)?/trans>q導(dǎo)致退出時(shí)跳過腳本的其余部分。

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

sed "${NUM}q;d" file


查看完整回答
反對(duì) 回復(fù) 2019-07-08
?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

我有一個(gè)獨(dú)特的情況,我可以基準(zhǔn)的解決方案在這一頁(yè),所以我寫這個(gè)答案,作為對(duì)建議的解決方案與每個(gè)包含的運(yùn)行時(shí)間的整合。

設(shè)置

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

因?yàn)槲募羞@么多行:

  • 我只需要提取行的一個(gè)子集就可以對(duì)數(shù)據(jù)做任何有用的事情。
  • 閱讀每一行,直到我關(guān)心的值,將需要很長(zhǎng)的時(shí)間。
  • 如果解決方案讀取了我關(guān)心的行,并繼續(xù)讀取文件的其余部分,那么它將浪費(fèi)時(shí)間讀取將近30億個(gè)不相關(guān)的行,并且花費(fèi)比需要長(zhǎng)6倍的時(shí)間。

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

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

我將使用time內(nèi)置以對(duì)每個(gè)命令進(jìn)行基準(zhǔn)測(cè)試。

基線

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

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

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

我對(duì)這件事很懷疑,但值得一試:

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

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

AWK

我只使用exit因?yàn)槲也淮蛩愕却暾奈募\(yùn)行:

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

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

Perl

我還運(yùn)行了現(xiàn)有的Perl解決方案:

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

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

SED

最重要的答案是,這是我的結(jié)果:

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

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

地圖檔

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

結(jié)語

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

(按公式計(jì)算的百分比)% = (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


查看完整回答
反對(duì) 回復(fù) 2019-07-08
  • 3 回答
  • 0 關(guān)注
  • 730 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)