如何在bash,空格分隔平面文件中订购?

时间:2013-12-21 15:12:43

标签: bash

如果a有一个平面文件数据库,其中的字段由空格分隔,如下所示:

Name    Salary_cost function
Luc     50000       Engineer in mechanics
Gerard  35000       Bad in all, good at nothing
Martijn 150000      Director 
Robert  45000       Java Specialist
(...)

我想通过Salary_cost订购这些东西。我可以用这种东西来订购

cat file.txt | sed-e 's/ \+/\t/g' | sort -k 2

但这不好,因为

  • 第一行不是要订购的数据(只有纯粹的危险把它放在顶部或底部或有时,上帝知道在哪里......)。
  • 如果字段的顺序发生变化或者我添加了一些文件,那么我必须重写...
  • 很复杂。我使用数字来指定字符串名称(而不是数字)。
  • 不优雅。
  • 数据已修改。
  • ...

我想过像Recutils这样的东西。但是我无法掌握如何将它用于此目的。

我可以通过“Salary_cost”字段对此文件进行排序,将其他行视为记录,将第一行视为数据头,使用命令行界面(bash,sh,ksh,...)?

有很多接口可以产生这样的输出,例如:df,transmission-remote,ps,......即使是昏迷分离的文件也接近这个结构。

1 个答案:

答案 0 :(得分:1)

您可以使用带有排序的头部,尾部组合:

fld="Salary_cost"

n=$(awk -v q="$fld" 'NR==1{for (i=1; i<=NF; i++) if ($i==q) {print i; exit}}' file)

head -1 file && tail -n +2 file | sort -nk$n
Name    Salary_cost function
Gerard  35000       Bad in all, good at nothing
Robert  45000       Java Specialist
Luc     50000       Engineer in mechanics
Martijn 150000      Director