【问题标题】:Is it possible to sort a file by part of a line?是否可以按行的一部分对文件进行排序?
【发布时间】:2013-10-25 10:31:20
【问题描述】:

我正在编写 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 命令,但我似乎找不到具有我需要的正确选项的命令。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • -t-k 选项 sort 将允许您将分隔符设置为 : 并分别选择要排序的字段。例如,sort -t: -k2 inputFile.txt 应该按名字排序。
  • 您可以使用 perl 中的 Schwartzian Transform 技术(复制选定的列作为行的前缀,排序,然后删除前缀列)。或者只使用 perl ftw!
  • 谢谢你,@iscfrc!这对我有用!
  • cut -d: -f2 inputFile.txt | sort 根据第二个字段(名字)对结果进行排序。

标签: shell sorting scripting sed cut


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多