Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash(一个空格分隔的平面文件)中排序?_Bash - Fatal编程技术网

如何在bash(一个空格分隔的平面文件)中排序?

如何在bash(一个空格分隔的平面文件)中排序?,bash,Bash,如果有一个平面文件数据库,其中的字段由空格分隔,如下所示: Name Salary_cost function Luc 50000 Engineer in mechanics Gerard 35000 Bad in all, good at nothing Martijn 150000 Director Robert 45000 Java Specialist (...) 我想按工资和成本来订购这些东西。我可以用这种东西点这个

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

Name    Salary_cost function
Luc     50000       Engineer in mechanics
Gerard  35000       Bad in all, good at nothing
Martijn 150000      Director 
Robert  45000       Java Specialist
(...)
我想按工资和成本来订购这些东西。我可以用这种东西点这个

cat file.txt | sed-e 's/ \+/\t/g' | sort -k 2
但这不好,因为

  • 第一行不是要排序的数据(只是将其放在顶部或底部,有时,天知道在哪里…)
  • 如果字段的顺序改变或者我添加了一些文件,那么我必须重写
  • 这很复杂。我使用number来指定字段名,这些字段名是string(而不是number)
  • 它不优雅
  • 数据被修改
我想到了一些类似轮回的东西。但我不知道如何使用它来达到这个目的

我可以使用命令行界面(bash、sh、ksh等)按“Salary_cost”字段对该文件进行排序,将其他行视为记录,将第一行视为数据头吗


有许多接口产生这种输出,例如:测向、远程传输、ps。。。即使是分开的文件也接近这种结构。

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

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 
fld=“工资成本”
n=$(awk-v q=“$fld””NR==1{for(i=1;iYes,但“工资成本”替换为不清楚的“2”。