2017-04-12 12 views
0

私はスペースで区切られた一連の非常に大きな一続きのファイルを持っています。それは私が最初のコピーに、各ファイルの最初のn個の要素を読みたいbash:ファイル内の最初の 'n'個のエントリを読み取る

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

のように見えます。

空白を改行(cat file.txt | tr ' ' '\n' > file2.txt)に変換して一行ずつ読み込んで、各行を新しいファイル(head -n $n file2.txt | while read line; do echo $line >> file3.txt;done)に保存すると非常に遅くなる可能性があります。 (上のコードはテストされていません)

一行のファイルの最初のn個の値を効率的にコピーするにはどうすればよいですか?

注:これは、定義されていない値の数に対応していても、最初のn文字をコピーしても問題ありません。

+0

「カット」コマンドはどうですか? – Jdamian

+0

100バイトの場合、 'dd if = BigBoy bs = 100 count = 1'または' 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 

(又は)項目1〜5のデリミッタと-f 1-5を設定するためPOSIX準拠オプションでcut-dを用い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 

(OR)を使用して、同じ行に印刷します。

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

私はで、egrepに慎重に設計された正規表現を使用したいです

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

プリントアウト:それだけで一致した出力印刷にするフラグgrepのよう

0.993194 0.9684194 0.846847658 

はかなりよく知られており、非常に重く、最適化されたツールであり、これはかなりよく実行します。私は3メガバイトのテキストファイルで試してみましたが、30バイトのテキストファイルよりも大幅に時間がかかりませんでした。

関連する問題