自动更新数据文件和显示?

时间:2010-11-24 01:27:20

标签: bash function programming-languages

我正在尝试开发一个系统,此应用程序允许用户预订机票座位。我正在尝试实现一个自动系统(一个功能),应用程序可以为用户选择最佳座位。

我当前的数据库(seats.txt)文件以这种方式存储(不确定它是否是一个好的格式:

X000X
00000
0XXX0

其中X表示座位被占用,0表示什么都没有。

用户登录我的系统后,选择“最适合您”,用户将会提示输入他/她想要的座位数(我已完成此部分),现在,如果用户输入:2,我将从第一行检查,看看是否有空座位,如果是,那么我分配(这是一个简单的方法,一旦我得到这个工作,我会写一个更好的“自动预订”算法)

我尝试使用sed,awk,grep ..但它只是无法工作(我是bash编程的新手,只是在3天前学习bash)。

任何人都可以提供帮助吗?

仅供参考:seat.txt格式不一定是这样。它也可以将所有座位存储在一行中,例如:X000X0XXX00XXX

谢谢=)

2 个答案:

答案 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