我想用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行的窗口,并在文件末尾删除它。