删除一系列文件的最后162行,在forloop中重命名文件



我想用bash脚本从一系列文件中删除最后162行。

for i in RMSF_CA_proA_*; do | tac $i | sed '1,162d' | tac >> tmp && mv tmp $i

显示错误

bash: tac: command not found.

我还想在for循环中依次重命名文件。

应该可以:

#!/usr/bin/env sh
# Fail on error
set -o errexit
# Enable wildcard character expansion
set +o noglob
# ================
# CONFIGURATION
# ================
# File pattern
FILE_PATTERN='RMSF_CA_proA_'
# Lines to delete
N_LINES=162
# ================
# MAIN
# ================
{
# Check command 'sed' exists
command -v sed > /dev/null 2>&1 || {
printf "Command 'sed' not foundn" >&2
exit 1
}
# Check command 'mv' exists
command -v mv > /dev/null 2>&1 || {
printf "Command 'mv' not foundn" >&2
exit 1
}
index=0
for file in "$FILE_PATTERN"*; do
# Skip if not file
[ -f "$file" ] || continue
printf "Analyzing file '%s'n" "$file"
# https://stackoverflow.com/a/13383331/6676781
# Delete last 'N_LINES' from 'file'
sed 
-i 
-e :a 
-e "$d;N;2,${N_LINES}ba" 
-e 'P;D' 
"$file"
# Rename 'file' to 'index'
printf "Renaming file from '%s' to '%s'n" "$file" "$index"
mv "$file" "$index"
# Increment index
index=$((index = index + 1))
done
}

根据您的喜好调整配置参数。
使用sed,从$file中删除最后的$N_LINES行(参见此)。更改已经完成,因此不需要保存输出,然后再修改文件。

Mac OS X下sed命令不接受空的-i选项。因此,在-i之后添加''(参见此):

sed 
-i '' 

tac既非标准也非必需。当您想编辑文件时,请使用像ed这样的文件编辑器,而不是它的衍生产品sed(用于编辑)。

for i in RMSF_CA_proA_*; do
printf '%sn' '$' '-161,$d' 'w' | ed -s "$i" > /dev/null
done

ed从标准输入读取命令,每行一个命令。$命令将文件的最后一行作为当前行。-161,$d删除所需的行,其范围从当前行之前的第161行一直延伸到并包括当前行。w在退出前保存更改。

这可能适合您(GNU sed):

sed -i ':a;$d;N;s/n/&/162;Ta;P;D' RMSF_CA_proA_*

创建一个162行的窗口,并在文件末尾删除它。

最新更新