どのように私は、UNIX上での行番号を使用してファイルから行を抽出していますか?
-
19-09-2019 - |
質問
ファイルから行を抽出する方法を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
所属していません StackOverflow