폴더에 .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줄을 삭제하므로 먼저 백업을 만드세요 .