n
このラインブロックのathラインから始まり、各ラインのラインを取得する非常に簡単な方法(おそらくsedラインを使用するのですか?)はありますか?n
m
具体的には、何百万行ものファイルがあります。 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
i
1行目以降にのみこれを行うには、前の行を次にリダイレクトするだけです/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、メートル=4、n=2:
sed -n '5,$ {p;n;p;n;n;}'
どこ
5
簡単に言えばそうだ。ㅏ;p;n;p
p
コマンドが繰り返されるかどうかN時間、n
命令を含む(通常p;n;p;n;…;p;n;p
:)。n;n
n
コマンドが繰り返されるかどうかマンガン回数(通常はn;n;n;…;n
:)。
出力例:
$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13
大容量ポータブルソリューションが必要な場合米または米またはNそれをあらかじめ知らなければそれを利用すればいいとawk
思います。