我正在尝试开发一个系统,此应用程序允许用户预订机票座位。我正在尝试实现一个自动系统(一个功能),应用程序可以为用户选择最佳座位。
我当前的数据库(seats.txt)文件以这种方式存储(不确定它是否是一个好的格式:
X000X
00000
0XXX0
其中X表示座位被占用,0表示什么都没有。
用户登录我的系统后,选择“最适合您”,用户将会提示输入他/她想要的座位数(我已完成此部分),现在,如果用户输入:2,我将从第一行检查,看看是否有空座位,如果是,那么我分配(这是一个简单的方法,一旦我得到这个工作,我会写一个更好的“自动预订”算法)
我尝试使用sed,awk,grep ..但它只是无法工作(我是bash编程的新手,只是在3天前学习bash)。
任何人都可以提供帮助吗?
仅供参考:seat.txt格式不一定是这样。它也可以将所有座位存储在一行中,例如:X000X0XXX00XXX
谢谢=)
答案 0 :(得分:1)
这是让你入门的东西。此脚本从您的文件中读取每个座位,并显示它是否已被占用或空,并始终跟踪行和列号。
#!/bin/bash
let ROW=1
let COL=1
# Read one character at a time into the variable $SEAT.
while read -n 1 SEAT; do
# Check if $SEAT is an X, 0, or other.
case "$SEAT" in
# Taken.
X) echo "Row $ROW, col $COL is taken"
let COL++
;;
# Empty.
0)
echo "Row $ROW, col $COL is EMPTY"
let COL++
;;
# Must be a new line ('\n').
*) let ROW++
let COL=1
;;
esac
done < seats.txt
请注意,我们在脚本末尾提供seats.txt
,而不是在开头。这很奇怪,但那是你的UNIX。奇怪的是,整个while循环就像一个大命令:
while read -n 1 SEAT; do {stuff}; done < seats.txt
最后的<
将seats.txt
作为一个整体提供给循环,特别是read
命令。
答案 1 :(得分:1)
你在这里要求的帮助并不是很清楚。 “任何人都可以帮忙吗?”是一个非常广泛的问题。
如果你问你是否使用了正确的工具,那么文本处理工具(sed/awk/grep
等)是理想的,因为最初的要求是bash
首先。我个人会选择与bash
不同的基线,但是,如果这是您已经决定的,那么您的工具选择就可以了。
我应该提到bash
本身可以做很多你可能会用文本处理工具做的事情,而不需要花费很多时间来启动外部进程。但是,既然你正在使用bash
,我会假设性能不是你的主要关注点(不要误解我的意思,bash
可能会很快足够你的目的)。
我 可能会坚持使用多行数据表示,原因有两个。首先,如果您将行彼此分开,则简单的文本搜索两个座位将更容易。否则,在5seat-by-2row XXXX00XXXX
中,简单搜索会将这两个0
座位考虑在一起,尽管事实上它们彼此不在一起:
XXXX0
0XXXX
其次,有些人认为这一行非常重要。我不会坐在当地电影院的前五排,因为我必须继续动脑子才能看到所有动作。
举例来说,你可以获得连续两个座位的最前面一行(命令被拆分以便于阅读):
pax> cat seats.txt
X000X
00000
0XXX0
pax> expr $(
(echo '00000';cat seats.txt)
| grep -n 00
| tail -1
| sed 's/:.*//'
) - 1
2
expr
魔法和额外echo
是为了确保在没有座位可用时返回0。你可以通过以下方式获得该行中的第一个位置:
pax> cat seats.txt
| grep 00
| tail -1
| awk '{print index($0,"00")}'
3