是否可以按行的一部分对文件进行排序?

时间:2013-10-17 04:13:57

标签: shell sorting scripting sed cut

我正在编写shell脚本,我有一个学生及其信息文件(inputFile.txt):

Bonerake:Nicole:1011:410-111-0500:CS:09-12-1985
Fugett:Brandon:8188:410-111-0020:Biology:06-29-1982
Bozick:Julia:0333:410-111-0900:English:01-18-1984
Freeman:Andrew:7747:410-111-0060:Business:03-14-1988
Carroll:Sandra:4044:410-111-0000:History:12-19-1987
Everett:Terry:8666:410-111-0100:CS:01-24-1986
Boyer:Dennie:2212:410-111-0080:Math:08-02-1983

我应该根据用户输入的信息部分(即名字,姓氏等)进行排序。我可以为姓做这个,因为它是每行中的第一个。但是,我似乎无法进展任何其他信息。这是我尝试按名字排序,没有任何反应:

sortStudents(){
echo -e "Which information would you like to sort students by?"
echo -e "\t1) Last Name"
echo -e "\t2) First Name"
echo -e "\t3) Student ID"
echo -e "\t4) Phone Number"
echo -e "\t5) Major"
echo -e "\t6) Birthday"
echo -e "\t*** Input choice: \c"
read choice

case "$choice" in
    1) sort inputFile.txt -o inputFile.txt ;;
    2) cut -d: -f2 inputFile.txt | sort inputFile.txt -o inputFile.txt ;;
esac

return $TRUE
}

我使用-f2因为我认为这意味着转到由分隔符分隔的第二个字段。我搜查了一下;尝试了多个不同的cutsedgrep命令,但我似乎找不到具有我需要的正确选项的命令。任何帮助将非常感谢。谢谢。

1 个答案:

答案 0 :(得分:0)

在你的代码示例中,sort命令确实应该从标准输入读取:

2) cut -d: -f2 inputFile.txt | sort - -o inputFile.txt ;;

(这可能就是为什么看起来没有排序)

但是,在这种情况下,您应该使用sort的内置选项:

sort -t: -k$choice inputFile.txt -o inputFile.txt 

该联机帮助页描述了选项:

   -k, --key=POS1[,POS2]
          start a key at POS1, end it at POS2 (origin 1)

   -t, --field-separator=SEP
          use SEP instead of non-blank to blank transition