m行ごとにn行を取得する方法(n

m行ごとにn行を取得する方法(n

nこのラインブロックのathラインから始まり、各ラインのラインを取得する非常に簡単な方法(おそらくsedラインを使用するのですか?)はありますか?nm

具体的には、何百万行ものファイルがあります。 4行ごとに最初の2行をインポートしたいと思います。

しかし、他の同様の状況でもそうする考えも理解したいと思います。だからここではもっと一般的な質問をしたいと思います。

答え1

~GNU sedのアドレスで利用できます。

sed -n '1~4p;2~4p'

「最初の行を4行ごとに印刷し、2行目を4行ごとに印刷します。」または「1行から始めて、4行ごとに印刷し、2行で始まり、4行ごとに印刷します。」とされています。

答え2

そしてgnu split

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile

i1行目以降にのみこれを行うには、前の行を次にリダイレクトするだけです/dev/null

n=2
m=4 
i=7
{ sed ${i}q >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile

gnuツールにアクセスできない場合は、次のものを使用できますawk

awk -v n=2 -v m=4 -v i=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile

答え3

GNU sedの場合

sed '3~4,+1 d' file

またはより一般的に:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file

答え4

これは移植可能で非常に簡単なソリューションですsed~他の多くの答えのように移植性のないものを使用しません。欠点は、以下にsed基づいてコードを書く必要があることです。そしてN、簡単に通過できませんそしてNパラメータとして。実際、このソリューションは次の場合に効果的です。そしてNあらかじめ知って小さく調べてください。

~のためa=5メートル=4n=2:

sed -n '5,$ {p;n;p;n;n;}'

どこ

  • 5簡単に言えばそうだ。;
  • p;n;ppコマンドが繰り返されるかどうかN時間、n命令を含む(通常p;n;p;n;…;p;n;p:)。
  • n;nnコマンドが繰り返されるかどうかマンガン回数(通常はn;n;n;…;n:)。

出力例:

$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13

大容量ポータブルソリューションが必要な場合またはまたはNそれをあらかじめ知らなければそれを利用すればいいとawk思います。

関連情報