2017-02-19 19 views
0

Я хочу отсортировать этот файл по absolute значение столбца линейной регрессии (p) в порядке убывания. Моя попытка сделать это не сработала. Я не уверен, что он терпит неудачу. Я нашел этот код от http://www.unix.com/shell-programming-and-scripting/168144-sort-absolute-value.html.Сортировка файла в unix по абсолютному значению поля

awk -F',' '{print ($2>=0)?$2:-$2, $0}' OFS=',' mycsv1.csv | sort -n -k8,8 | cut -d ',' -f2- 



X var,Y var,MIC (strength),MIC-p^2 (nonlinearity),MAS (non-monotonicity),MEV (functionality),MCN (complexity),Linear regression (p) 
AT1G01030,AT1G32310,0.67958,0.4832027,0.32644996,0.63247,4.0,-0.44314474 
AT1G01030,AT3G06520,0.61732,0.17639545,0.23569,0.58557,4.0,0.6640215 
AT1G01030,AT5G42580,0.61579,0.5019064,0.30105,0.58143,4.0,0.33746648 
AT1G01030,AT1G55280,0.57287,0.20705527,0.19536,0.52857,4.0,0.6048262 
AT1G01030,AT5G30490,0.56509,0.37536618,0.16172999,0.51847,4.0,-0.43557298 
AT1G01030,AT1G80040,0.56268,0.22935495,0.18583998,0.52728,4.0,-0.5773431 
... 

Пожалуйста, помогите мне понять скрипт awk для сортировки этого файла.

+0

Что такое «не совсем работы «? – pvg

+0

. Он не сортировал по столбцу 8 или любой другой колонке. так что я не уверен, почему это сработало. – ChathuraG

+0

Немного поближе посмотрите на код, который должен был помочь здесь. Я имею в виду, почему вы смотрите на поле '$ 2' в' awk', когда вас интересует восьмое поле? – hek2mgl

ответ

1

Вы можете использовать sed и sort для этого и следовать очень умной логике @ hek2mgl по добавлению и удалению поля в конце, чтобы сохранить оригинальный номер:

sed -E 's/,([-]?)([0-9.]+)$/,\1\2,\2/' file | sort -t, -k9,9 -nr | cut -f1-8 -d, 
  • sed -E 's/,([-]?)([0-9.]+)$/,\1\2,\2/' => создает поле- как абсолютное значение поля 8
  • sort -t, -k9,9 -nr => сортирует по вновь созданной области, числовое и нисходящего порядок
  • cut -f1-8 -d, => удаляет 9-поле, восстановление вывода в исходном формате, с желаемым порядком сортировки

Вот результат:

AT1G01030,AT3G06520,0.61732,0.17639545,0.23569,0.58557,4.0,0.6640215 
AT1G01030,AT1G55280,0.57287,0.20705527,0.19536,0.52857,4.0,0.6048262 
AT1G01030,AT1G80040,0.56268,0.22935495,0.18583998,0.52728,4.0,-0.5773431 
AT1G01030,AT1G32310,0.67958,0.4832027,0.32644996,0.63247,4.0,-0.44314474 
AT1G01030,AT5G30490,0.56509,0.37536618,0.16172999,0.51847,4.0,-0.43557298 
AT1G01030,AT5G42580,0.61579,0.5019064,0.30105,0.58143,4.0,0.33746648 
+1

Спасибо, сработало – ChathuraG

+0

Если вы выберете разделитель по умолчанию для сортировки и вырезания (\ t), а не из первой команды, вам не нужно указывать их в последующих командах. –

0

три шага:

(1) Временно создать 9th поле, которое содержит абс значение поля 8:

LC_COLLATE=C awk -F, 'NR>1{v=$NF;sub(/-/,"",v);printf "%s%s%s%s",$0,FS,v,RS}' file 
     ^------ make sure this is set since sorting, especially the decimal point 
      depends on the local. 

(2) Сортировка, что вывод на основе 9-го поля:

command_1 | sort -t, -k9r 

(3) Труба, которая возвращается в awk, чтобы удалить последнее поле. NF-- уменьшает количество полей, которые эффективно удалят последнее поле. 1 всегда верно, что делает awk Распечатайте эту строку:

command_2 | cut -d, -f1-8 

Выход:

AT1G01030,AT3G06520,0.61732,0.17639545,0.23569,0.58557,4.0,0.6640215 
AT1G01030,AT1G55280,0.57287,0.20705527,0.19536,0.52857,4.0,0.6048262 
AT1G01030,AT1G80040,0.56268,0.22935495,0.18583998,0.52728,4.0,-0.5773431 
AT1G01030,AT1G32310,0.67958,0.4832027,0.32644996,0.63247,4.0,-0.44314474 
AT1G01030,AT5G30490,0.56509,0.37536618,0.16172999,0.51847,4.0,-0.43557298 
AT1G01030,AT5G42580,0.61579,0.5019064,0.30105,0.58143,4.0,0.33746648 
+1

, вы также должны установить 'LC_COLLATE' вместо' LANG', чтобы избежать других возможных нежелательных побочных эффектов при изменении языка. –

+2

Поскольку количество столбцов известно, 'cut' может быть лучшей альтернативой' awk'. Изменено это и теперь с помощью 'LC_COLLATE'. – hek2mgl

0

удалось получить AWK, чтобы сделать все это:

awk -F, 'NR>1{n[substr($NF,1,1)=="-"?substr($NF,2):$NF]=$0}NR==1;END{asorti(n,out);for(i in out)print n[out[i]]}' file