どのように私は、UNIX上での行番号を使用してファイルから行を抽出していますか?

StackOverflow https://stackoverflow.com/questions/2017034

質問

ファイルから行を抽出する方法をSEDまたは類似の使用?私は、ファイルからの行1、5、1010、20503を望んでいた場合、どのように私はこれらの4行を取得するのでしょうか?

私はラインのかなり大きな数を持っている場合は、

私は何を抽出する必要がありますか? 私は100行、それぞれが、私は別のファイルから抽出したい行番号を表すのファイルを、持っていた場合、私はそれを行うだろうか?

役に立ちましたか?

解決

以下のような

サムシング「のsed -n '1P; 5P; 1010p; 20503p'。コマンドを実行し、 "詳細については、" sedの男を

は、あなたの2番目の質問については、私は(1)私が欲しかった行を出力するコマンドのsedの束の中に、入力ファイルを変換したい。

他のヒント

のawkでそれは同じくらい簡単です

awk 'NR==1 || NR==5 || NR==1010' "file"

@OP、あなたがawkのでこれより簡単に、より効率的に行うことができます。ので、あなたの最初の質問のための

awk 'NR~/^(1|2|5|1010)$/{print}' file

2回目の質問には、

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file
それはsedの正規表現の施設に加えて、それはあなたが行毎にファイルを読み込むことができるように、周囲のプログラミングモデルを持っているので、

私は、ファイルからを含む(あなたが欲しいものに応じて線やエキスを数え、Perlを調べたいです行番号)。

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

これはかなりではない、それはいくつかの状況下では、コマンドの長さ制限 * を超える可能性があります:

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

またはそのはるかに遅いが、より魅力的な、そしておそらくより行儀、兄弟ます:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

バリエーションます:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

あなたは83または多分419あるいは1177、言う、のようないくつかの大規模な引数でxargオプションを追加することにより、-Pバージョンを少しスピードアップすることができますが、10は、任意のと同じくらい良いようです。

<サブ> * xargs --show-limits </dev/nullが有益であることができる

Perlでます:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top