X~Y 行が満たす条件に対してのみテキスト処理を行います。

X~Y 行が満たす条件に対してのみテキスト処理を行います。

XからYまでの行にのみ表示される重複行を削除し、ファイルを所定の位置に変更するにはどうすればよいですか?

たとえば、10行から20行の重複行のみを削除したい場合です。

ベストアンサー1

GNUを使用するawk(4.1.0以降のinplace拡張1):

gawk -i /usr/share/awk/inplace.awk '
  NR >= 10 && NR <= 20 {
    if ($0 in seen) next
    seen[$0]
  }
  {print}' ./file

または以下を使用してperl

perl -ni -e 'print if $. < 10 or $. > 20 or !$seen{$_}++' ./file

複数のファイル処理:

gawk -i /usr/share/awk/inplace.awk '
  BEGINFILE{delete seen}
  FNR >= 10 && FNR <= 20 {
    if ($0 in seen) next
    seen[$0]
  }
  {print}' ./*.txt

または以下を使用してperl

perl -ni -e '
  print if $. < 10 or $. > 20 or !$seen{$_}++;
  if (eof) {close ARGV; undef %seen}' ./*.txt

^使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

おすすめ記事