【发布时间】:2015-01-07 06:57:33
【问题描述】:
我有一个文本文件,我通过各种服务器 crontab 的 bash 脚本生成,格式如下:
0 sys1 server1
5 sys2 server2
2,3 sys3
0 sys3 server3
7 sys4 server4
....
我希望它变成这样:
0 sys1 server1
5 sys2 server2
2 sys3 server3
3 sys3 server3
0 sys3 server3
7 sys4 server4
....
我遇到的问题是,如果每个系统/服务器有两个或更多数字,它总是可以改变,并且每个服务器也可能有两个以上的 crontab 条目。
我的尝试是这样的:
rday_old=""
rsys_old=""
rser_old=""
[[ -e output ]] && rm output
while read -u5 -r -a line; do
rday=${line[0]}
rsys=${line[1]}
rser=${line[2]}
if [[ "$rsys_old" == "$rsys" ]]; then
echo "$rday_old $rsys_old $rser" >> output
else
echo "$rday $rsys $rser" >> output
fi
rday_old=$rday
rsys_old=$rsys
rser_old=$rser
done 5< input_file
问题显然在于它不会像预期的那样工作。我不知道解决这个问题的最佳方法是什么。我的尝试没有考虑到如果一天的格式为 2,3 或 2,4,5 甚至 crontab 格式的最多 7 天(这将是一个 * 符号),则需要拆分这一天。此外,我可能需要存储多个 rday_old、rsys_old 和 rser_old。
我希望我以一种可以理解的方式陈述我的问题。 提前感谢您的帮助。
编辑:
在@anishsane 的回答之后,我将他的回答固定为
cat input | awk '{sys=$2; ser=$3; split($1,a,","); for(i in a){print a[i]" " sys " " ser}}' > output
但它现在作为结果输出:
0 sys1 server1
5 sys2 server2
2 sys3
3 sys3 server3
0 sys3 server3
7 sys4 server4
....
所以我快到了。
【问题讨论】:
标签: bash