質問

たとえば、最初の1e6行をスキップして印刷したい非常に長いファイルがあります。 catのmanページを調べますが、これを行うオプションはありませんでした。これを実行するコマンドまたは単純なbashプログラムを探しています。

役に立ちましたか?

解決

テールが必要です。いくつかの例:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

特定の数の<!> quot; first <!> quot;をスキップする必要がある場合行、使用

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

つまり、N行をスキップする場合は、行N + 1の印刷を開始します。例:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

最後の行だけを表示する場合は、<!> quot; + <!> quot;:

を省略します
$ tail -n <N> <filename>
< last N lines of file. >

他のヒント

システムでGNU tailを使用できる場合、次の操作を実行できます。

tail -n +1000001 huge-file.log

必要なことを行うのは+文字です。 manページから引用するには:

  

Kの最初の文字(バイト数または行数)が   `+ '、各ファイルの先頭からK番目の項目から印刷します。

したがって、コメントに記載されているように、+ 1000001を入力すると、最初の1,000,000行の後の最初の項目から印刷が開始されます。

ファイルの最初の10行を削除する最も簡単な方法:

$ sed 1,10d file.txt

AWKを使用した冗長度の低いバージョン:

awk 'NR > 1e6' myfile.txt

ただし、整数を使用することをお勧めします。

sedの代替案を提案するだけです。 :)最初の100万行をスキップするには、|sed '1,1000000d'を試してください。

例:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

最初の2行をスキップする場合
tail -n +3 <filename>

最初のx行をスキップする場合
tail -n +$((x+1)) <filename>

最初の10行を表示する場合は、sedを次のように使用できます。

sed -n '1,10 p' myFile.txt

または20〜30行を表示する場合は、次を使用できます。

sed -n '20,30 p' myFile.txt

sed deleteコマンド 範囲アドレス。例:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

または、既知の範囲のみを印刷する場合は、-nフラグを指定してprintコマンドを使用します。

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

このソリューションは、GNUユーティリティの存在に関係なく、すべてのUNIXシステムで確実に動作するはずです。

このシェルスクリプトは私には問題なく動作します:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

このサンプルファイル(file.txt)で使用:

one
two
three
four
five
six

コマンド(ファイルの2行目から4行目までを抽出します):

edu@debian5:~$./script.sh 2 4 file.txt

このコマンドの出力:

two
three
four

もちろん、たとえば、すべての引数値が期待どおりであることをテストすることで、改善できます:-)

これを行うには、headコマンドとtailコマンドを使用します。

head -n <num> | tail -n <lines to print>

numは1e6 +印刷する行数です。

sed -n '1d;p'

このコマンドは、最初の行を削除して残りを印刷します

cat < File > | awk '{if(NR > 6) print $0}'

同じことをする必要があり、このスレッドを見つけました。

<!> quot; tail -n +を試しましたが、すべてが印刷されました。

プロンプトで+行を追加するとうまくいきましたが、ヘッドレスモード(cronjob)で実行すると動作がまったく異なることがわかりました。

私はついに自分でこれを書きました:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top