在Bash中排序和过滤

时间:2013-09-03 07:55:15

标签: bash

我有一个以下格式的文件:

somePlane (1,2,3) (1,0,0) (0,0,1) R
awsomePlane (1,0,0) (0,1,0) (0,0,1) B
nicePlane (1,1,1) (2,4,7) (7,1,0) G

我正在尝试按照第一列的字母顺序对其进行排序,并将其放入数组中,而每行都是数组元素。

但是我甚至无法对它进行排序,也不知道如何将每一行放入数组元素中。

我尝试了以下方法进行排序,但它不起作用:

sort -t" " -k1 myfile.txt

如何对其进行排序并将其插入数组?

[编辑] 我有一个错误,似乎我能够对它进行排序,但我仍然不知道如何将每一行插入到数组中。 我使用以下命令进行排序:

sort -t" " -f -k1 myfile.txt 

2 个答案:

答案 0 :(得分:2)

您可以将线条排序并存储到数组中,如下所示:

# sort and create array
$ IFS=$'\n' arr=( $(sort file.txt) )

# access array elements
$ echo ${arr[0]}
awsomePlane (1,0,0) (0,1,0) (0,0,1) B    

$ echo ${arr[1]}
nicePlane (1,1,1) (2,4,7) (7,1,0) G    

$ echo ${arr[2]}
somePlane (1,2,3) (1,0,0) (0,0,1) R

答案 1 :(得分:0)

如果您使用的是Bash 4.0或更新版本,最好的方法是使用readarraymapfile的同义词)重定向和process substitution,因为它不需要循环和风险pathname expansions

readarray -t ARRAY < <(exec sort -t" " -f -k1 myfile.txt)

示例输出:

> for I in "${!ARRAY[@]}"; do echo "$I : ${ARRAY[I]}"; done
0 : awsomePlane (1,0,0) (0,1,0) (0,0,1) B
1 : nicePlane (1,1,1) (2,4,7) (7,1,0) G
2 : somePlane (1,2,3) (1,0,0) (0,0,1) R