我的文件夹中有一个 .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 行中的行。