[英]bash: Reading first 'n' entries in a file
我有一系列非常大的單行文件,它們之間用空格分隔。 看起來像
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
),然后cat file.txt | tr ' ' '\\n' > file2.txt
讀取並將每一行保存在新文件中( head -n $n file2.txt | while read line; do echo $line >> file3.txt;done
),但這會非常慢。 (以上代碼未經測試)
如何有效地復制單行文件的前n個值?
注意:我可以復制前n個字符,即使這對應於未定義的值數量。
僅使用awk
並指定所需的記錄數如何?
awk -v n=5 '{for(i=1;i<=n;i++) print $i}' file
0.993194
0.9684194
0.846847658
1.0
1.0
(或)使用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
(或)使用帶有POSIX
兼容選項的cut
, -d
用於設置定界符, -f 1-5
用於字段1至5。
cut -d' ' -f 1-5 file
0.993194 0.9684194 0.846847658 1.0 1.0
我將在egrep
使用經過精心設計的正則表達式,並帶有-o
標志以使其僅輸出匹配的輸出:
egrep -e '^([0-9.]+[ ]*){3}' -o file.txt
打印輸出:
0.993194 0.9684194 0.846847658
由於grep是一個非常知名且經過高度優化的工具,因此它的效果非常好; 我只是在一個3兆字節的文本文件上進行了嘗試,並沒有比在30字節的文本文件上花費更長的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.