仅针对从 X 行到 Y 行满足的条件进行文本处理

Par*_*met 5 sed awk perl text-processing

我们如何删除仅在 X 到 Y 行中看到的重复行并就地更改文件?

例如,如果我只想删除第 10 行到第 20 行的重复行。

Sté*_*las 4

使用 GNU awk(4.1.0 或更高版本,扩展名inplace\xc2\xb9):

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

或者与perl

\n
perl -ni -e 'print if $. < 10 or $. > 20 or !$seen{$_}++' ./file\n
Run Code Online (Sandbox Code Playgroud)\n

处理多个文件:

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

或者与perl

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

\xc2\xb9不要使用-i inplaceas尝试首先从当前工作目录gawk加载inplace扩展名(asinplace或),否则有人可能会在其中植入恶意软件。随系统提供的扩展inplace.awk的路径可能会有所不同,请参阅输出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

\n