Pax 给出了一个很好的答案,但此代码调用的进程更少(11 与最少 56 = 7 * 8)。它使用一个辅助数据文件来给出星期几和它们的序列号。
cat <<! >p2input3
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
!
sort +1 p2input3 > p2.days
sort +1 p2input2 > p2.call
join -1 2 -2 2 p2.days p2.call | sort +2 > p2.duty
sort +0 p2input1 > p2.body
join -1 3 -2 1 p2.duty p2.body | sort +2n | tr '[A-Z]' '[a-z]' |
awk 'BEGIN { printf("%-14s %-14s %s\n", "Name", "On-Call", "Phone");
printf "\n"; }
{ printf("%-14s %-14s %s\n", $1, $2, $4);}'
rm -f p2input3 p2.days p2.call p2.duty p2.body
join 命令功能强大,但要求两个文件中的数据在连接键上按排序顺序排列。 cat 命令给出日期列表和日期编号。按日期名称的字母顺序列出的第一个排序位置。第二种也是按日期名称的字母顺序排列值班人员的姓名。然后第一个连接将这两个文件组合在日期名称上,然后根据用户名进行排序,产生输出:
Wednesday 3 Alice
Tuesday 2 Bob
Monday 1 Carol
Thursday 4 Dave
Friday 5 Frank
Saturday 6 Mary
Sunday 7 Ted
最后一个排序将姓名和电话号码按姓名字母顺序排列。然后第二个连接将姓名 + 电话号码列表与姓名 + 职责列表相结合,产生 4 列输出。这是通过tr 运行以使数据全部小写,然后使用awk 格式化,这很好地展示了它的强大和简单性(你可以使用Perl 或Python,但坦率地说,这会更麻烦)。
Perl 有一句座右铭:TMTOWTDI “有不止一种方法可以做到”。
这通常也适用于 shell 脚本。
我想我的代码没有使用循环......哦,亲爱的。将最初的 cat 命令替换为:
for day in "1 Monday" "2 Tuesday" "3 Wednesday" "4 Thursday" \
"5 Friday" "6 Saturday" "7 Sunday"
do echo $day
done > p2input3
这现在符合规则的文字。