如果 txt 文件包含字符,则在 bash 中删除最后 x 行

如果 txt 文件包含字符,则在 bash 中删除最后 x 行

我的文件夹中有一个 .txt 文件列表,如果最后 50 行(整行)包含字母字符,我想删除它们。到目前为止我有以下内容:

for i in *.txt
do max_line=$(cat ${i%.txt}.txt | wc -l)
   let min_line=max_line-50
   #
   sed -e "${min_line},${max_line}d" %{i%.txt}.txt
done
#

答案1

尝试

tac file | awk '/[[:alpha:]]/ && ++CNT <= 50 {next} 1' | tac

或者

tac file | awk '/[[:alpha:]]/ && NR <= 50 {next} 1' | tac

首先将检查最后几行是否包含字母,如果是,则数出其中的 50 行并踢出 ==> 正好踢出 50 行。第二个将检查 50 行,如果包含字母,则踢出 ==> 踢出小于或等于 50 行。

答案2

如果最后 50 行中要搜索的模式是“PATTERN”:

find . -maxdepth 1 -type f -name "*.txt" -exec sh -c '
  for f do
    n=$(($(cat $f|wc -l)-50+1));
    [[ $n -lt 1 ]] && n=1;
    sed -i "$n,$ {/PATTERN/ d}" $f;
  done' sh {} +

答案3

你说它是一个文件,使用文件编辑器。

for f in *.txt; do
  printf '%s\n' '-49,$g/pattern/d' w | ed -s "$f"
done

假设文件不为空,那么应该可以工作,否则如果文件为空,则在循环内添加一个测试并忽略/跳过它。此解决方案实际上会就地编辑文件,因此请使用一些示例文件进行测试,并请先备份,因为它将删除pattern最后 50 行中的行。

相关内容