13

sedなどを使用して、ファイルから行をどのように抽出しますか?ファイルから1、5、1010、20503行が必要な場合、これらの4行を取得するにはどうすればよいですか?

抽出する必要のある行がかなり多い場合はどうなりますか?100行のファイルがあり、それぞれが別のファイルから抽出したい行番号を表している場合、どうすればよいですか?

4

6 に答える 6

17

「sed-n'1p;5p; 1010p; 20503p'」のようなものです。詳細については、コマンド「mansed」を実行してください。

2番目の質問では、入力ファイルを一連のsed(1)コマンドに変換して、必要な行を出力します。

于 2010-01-06T23:09:22.087 に答える
6

awkを使用すると、次のように簡単になります。

awk 'NR==1 || NR==5 || NR==1010' "file"
于 2010-01-06T23:10:39.173 に答える
3

@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
于 2010-01-07T00:41:41.070 に答える
1

これはきれいではなく、状況によってはコマンドの長さの制限を超える可能性があります*

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追加することで、バージョンを少し高速化できますが、10はどれよりも優れているようです。-P

*有益xargs --show-limits </dev/nullなことができます

于 2010-01-07T05:21:39.447 に答える
0

sedPerlの正規表現機能に加えて、ファイルを1行ずつ読み取り、行数を数え、必要に応じて(行番号のファイルからも)抽出できるプログラミングモデルを備えているため、Perlを調査します。

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}
于 2010-01-06T23:08:49.870 に答える
0

Perlの場合:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
于 2010-03-17T19:27:48.327 に答える