フォルダに.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行を追い出します。 2番目は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行を削除するので、最初にバックアップを作成してください。