【发布时间】:2022-01-13 10:59:04
【问题描述】:
我正在编写一个脚本,它在所有文件和目录中找到最大行长度(使用 FIND),我将文件名作为脚本参数。
我有 while 循环,它遍历所有文件并打印每个文件中最长的行。在这个 while 循环遍历所有参数之后,有一个 PIPE 将这些结果传递给 awk,它应该只选择最长的一个并打印它。
这是代码:
{ while [ ! $# -eq 0 ]; do
if [ -f "$1" ]; then
awk -v name="$1:" ' {
if ( length > ln )
{ ln=length ;content[i=1]=$0 ;line[i]=NR }
else if ( length == ln )
{ content[++i]=$0 ; line[i]=NR }
}
END{ for(j=1;j<=i;j++) print name, line[j], ln, content[j] }' "$1"
elif [ -d "$1" ]; then
mapfile -d '' files_arr < <(find "$1" -type f \( -name "*[[:space:]]*" -o -name "*" \) -perm -a=r -print0)
for i in "${files_arr[@]}"; do
awk -v name="$i:" ' {
if ( length > ln )
{ ln=length ;content[i=1]=$0 ;line[i]=NR }
else if ( length == ln )
{ content[++i]=$0 ; line[i]=NR }
}
END{ for(j=1;j<=i;j++) print name, line[j], ln, content[j] }' "$i"
done
else
echo "Error: '$1': File like this doesnt exist." > /dev/stderr
exit 2
fi
shift
done
} | awk ' { if ( $3>max ) { max=$3 ; result[i=1]=$0 } else if ( $3==max ) { result[++i]=$0 } }
END{ for(j=1;j<=i;j++) print result[j] } '
问题是,当我有文件时,它不作为 2. 参数存在,然后我想打印错误消息并退出,但我的脚本打印错误并且还打印先前脚本参数的结果(例如第一个参数)。
再次感谢您的帮助!
【问题讨论】:
-
请创建并发布一个minimal reproducible example(强调minimal)来说明您的问题,不要发布您在该包含 代码中的某个地方存在问题,因为这使我们更难识别问题并为您提供帮助。见How to Ask。另外,请确保包含向我们展示您使用的 shell 的 shebang。
-
请包括您遇到的错误以及导致错误的输入。