2016-03-22 3 views
1

у меня есть TSV файл, содержащий химические названия, которые могут содержать скобки, запятые, знаки + и -, космические символы, [], {}, и т.д .:порядок сортировки с пробелами

$ cat random.txt 
ACETYLTHIOCHOLINE CHLORIDE CDRD-00117030-01 
ACETYLTRYPTOPHANAMIDE CDRD-00118894-01 
ACETYL ISOGAMBOGIC ACID CDRD-00119007-01 
ACETYLTRYPTOPHAN CDRD-00117996-01 
ACETYL ISOALLOGAMBOGIC ACID CDRD-00118740-01 
ACETAMINOPHEN CDRD-00116365-01 
ACETAMIDE CDRD-00116997-01 
ACETYLSALICYLIC ACID CDRD-00117028-01 
ACETYLSALICYLSALICYLIC ACID CDRD-00115640-01 
ACETYL TYROSINE ETHYL ESTER CDRD-00118256-01 

Я хочу найти файл отсортирован первый столбец:

$ cat correct.txt 
ACETAMIDE  CDRD-00116997-01 
ACETAMINOPHEN  CDRD-00116365-01 
ACETYL ISOALLOGAMBOGIC ACID  CDRD-00118740-01 
ACETYL ISOGAMBOGIC ACID  CDRD-00119007-01 
ACETYL TYROSINE ETHYL ESTER  CDRD-00118256-01 
ACETYLSALICYLIC ACID  CDRD-00117028-01 
ACETYLSALICYLSALICYLIC ACID  CDRD-00115640-01 
ACETYLTHIOCHOLINE CHLORIDE  CDRD-00117030-01 
ACETYLTRYPTOPHAN CDRD-00117996-01 
ACETYLTRYPTOPHANAMIDE CDRD-00118894-01 

что я получаю:

$ sort -k1,1 -t $'\t' -f -n random.txt > wrong.txt 
$ cat wrong.txt   
ACETAMIDE CDRD-00116997-01 
ACETAMINOPHEN CDRD-00116365-01 
ACETYL ISOALLOGAMBOGIC ACID  CDRD-00118740-01 
ACETYL ISOGAMBOGIC ACID CDRD-00119007-01 
ACETYLSALICYLIC ACID  CDRD-00117028-01 
ACETYLSALICYLSALICYLIC ACID CDRD-00115640-01 
ACETYLTHIOCHOLINE CHLORIDE CDRD-00117030-01 
ACETYLTRYPTOPHANAMIDE CDRD-00118894-01 
ACETYLTRYPTOPHAN CDRD-00117996-01 
ACETYL TYROSINE ETHYL ESTER CDRD-00118256-01 

Обратите внимание, что ACETYL TYROSINE ETHYL ESTER должно быть послеACETYL ISOGAMBOGIC ACID, тогда как ACETYLTRYPTOPHAN должно быть доACETYLTRYPTOPHANAMIDE.

Причина заключается в том, что join жалуется ACETYL TYROSINE ETHYL ESTER не сортируется (и о ACETYLTRYPTOPHAN когда первый был зафиксирован):

Второй файл для join:

$ cat test_data.txt 
Acetamide 0.904 0.146 0.134 -0.196 
Acetyltryptophan -0.558 -0.471 -0.13 -0.332 

Результаты join с wrong.txt:

$ join -a1 -1 1 -2 1 -t $'\t' -i test_data.txt wrong.txt 
Acetamide 0.904 0.146 0.134 -0.196 CDRD-00116997-01 
Acetyltryptophan -0.558 -0.471 -0.13 -0.332 
join: wrong.txt:9: is not sorted: ACETYLTRYPTOPHAN CDRD-00117996-01 

Конечно, join с correct.txt работы:

$ join -a1 -1 1 -2 1 -t $'\t' -i test_data.txt correct.txt 
Acetamide 0.904 0.146 0.134 -0.196 CDRD-00116997-01 
Acetyltryptophan -0.558 -0.471 -0.13 -0.332 CDRD-00117996-01 

Этот sort вызов не дает мне желаемый результат либо:

$ sort -k1,1 -t $'\t' -f -V random.txt 
ACETAMIDE CDRD-00116997-01 
ACETAMINOPHEN CDRD-00116365-01 
ACETYLSALICYLIC ACID CDRD-00117028-01 
ACETYLSALICYLSALICYLIC ACID CDRD-00115640-01 
ACETYLTHIOCHOLINE CHLORIDE CDRD-00117030-01 
ACETYLTRYPTOPHAN CDRD-00117996-01 
ACETYLTRYPTOPHANAMIDE CDRD-00118894-01 
ACETYL ISOALLOGAMBOGIC ACID CDRD-00118740-01 
ACETYL ISOGAMBOGIC ACID CDRD-00119007-01 
ACETYL TYROSINE ETHYL ESTER CDRD-00118256-01 

Как получить sort к выходу, что я хочу?

+0

ваш correct.txt генерируются 'родом random.txt' – haifzhan

ответ

1

уронить -n (числовой сортировки), и это должно работать:

sort -k1,1 -t $'\t' random.txt 

Конечно, это при условии, локаль использовании, имеет вид вам нужен заказ. Вы можете изменить его, чтобы проверить (при необходимости и локаль была составлена ​​в вашей системе)

LC_COLLATE=en_US.utf8 

В какой стране/язык вы работаете?

Эта работа правильно:

LC_COLLATE=C sort -k1,1 -t $'\t' random.txt 
Смежные вопросы