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개를 세어 Kick out ==> 정확히 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줄을 삭제하므로 먼저 백업을 만드세요 .

관련 정보