2013-09-03 2 views
0

У меня есть файл в следующем формате:Сортировка и фильтрация в 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 

Что я могу сделать, чтобы отсортировать его и вставить его в массив?

[EDIT] У меня была ошибка, и, похоже, мне удалось ее отсортировать, но я до сих пор не знаю, как вставлять каждую строку в массив. я использовал следующую команду для сортировки:

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

Что не сработало для вашего аргумента? – Juto

ответ

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 
+0

Я не уверен, что понимаю строку, начинающуюся с IFS ... –

+0

IFS - это внутренний разделитель полей. Вы должны установить его для символа новой строки, потому что каждый элемент в массиве должен быть одной строкой строки. – dogbane

+0

Спасибо! Приобретен и принят. –

0

Если вы используете Bash 4.0 или новее, лучший способ является использование readarray (синоним для mapfile) с перенаправлением и 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 
Смежные вопросы