2017-04-12 57 views
0

我有一系列空間分隔值非常大的單行文件。它看起來像bash:讀取文件中的第一個'n'條目

0.993194 0.9684194 0.846847658 1.0 1.0 1.0 1.0 0.78499 0.54879564 0.9998545 ... 

我想讀的第一個副本的每個文件的第n個元素。

我可以將空格轉換成新行(cat file.txt | tr ' ' '\n' > file2.txt),然後逐行讀取並將每行保存在一個新文件(head -n $n file2.txt | while read line; do echo $line >> file3.txt;done)中,但這會很慢。 (以上代碼未經測試)

如何有效地複製單行文件的前n個值?

注意:即使這對應於未定義數量的值,我仍然可以複製前n個字符。

+0

'cut'命令怎麼樣? – Jdamian

+0

'dd if = BigBoy bs = 100 count = 1' for 100 bytes,or'head -c 100 BigBoy' –

回答

2

如何使用awk指定想要的記錄數?

awk -v n=5 '{for(i=1;i<=n;i++) print $i}' file 
0.993194 
0.9684194 
0.846847658 
1.0 
1.0 

(或)使用cutPOSIX兼容選項,-d用於通過5字段的設置1解限制器和-f 1-5使用printf

awk -v n=5 '{for(i=1;i<=n;i++) printf "%s ",$i}' file 
0.993194 0.9684194 0.846847658 1.0 1.0 

(或)在同一行中打印。

cut -d' ' -f 1-5 file 
0.993194 0.9684194 0.846847658 1.0 1.0 
1

我會使用一個精心設計的正則表達式中egrep,與-o標誌,使其只打印匹配輸出:

egrep -e '^([0-9.]+[ ]*){3}' -o file.txt 

打印出:

0.993194 0.9684194 0.846847658 

作爲grep的是一個非常著名的和非常重優化的工具,這個執行得很好;我只是在一個3兆字節的文本文件上進行了嘗試,並沒有花費比30字節文本文件長得多的時間。