sedなどを使用して、ファイルから行をどのように抽出しますか?ファイルから1、5、1010、20503行が必要な場合、これらの4行を取得するにはどうすればよいですか?
抽出する必要のある行がかなり多い場合はどうなりますか?100行のファイルがあり、それぞれが別のファイルから抽出したい行番号を表している場合、どうすればよいですか?
sedなどを使用して、ファイルから行をどのように抽出しますか?ファイルから1、5、1010、20503行が必要な場合、これらの4行を取得するにはどうすればよいですか?
抽出する必要のある行がかなり多い場合はどうなりますか?100行のファイルがあり、それぞれが別のファイルから抽出したい行番号を表している場合、どうすればよいですか?
「sed-n'1p;5p; 1010p; 20503p'」のようなものです。詳細については、コマンド「mansed」を実行してください。
2番目の質問では、入力ファイルを一連のsed(1)コマンドに変換して、必要な行を出力します。
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 -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
なことができます
sed
Perlの正規表現機能に加えて、ファイルを1行ずつ読み取り、行数を数え、必要に応じて(行番号のファイルからも)抽出できるプログラミングモデルを備えているため、Perlを調査します。
my $row = 1
while (<STDIN>) {
# capture the line in $_ and check $row against a suitable list.
$row++;
}
Perlの場合:
perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file