2016-05-04 1 views
0

У меня есть список строк, которые мне нужно отсортировать по числу внутри строк, например.Сортировка по части строки

<sbb part="611-0068-01" desc="21.6TB HDD 2.5" qty="1"/> 
<sbb desc="19.2TB SSD/2.5in" part="611-0112-01" qty="1"/> 
<sbb part="611-0112-01" qty="1" desc="19.2TB SSD/2.5in"/> 
<sbb part="611-0112-02" desc="19.2TB SSD/2.5in" qty="1"/> 
<sbb part="611-0044-01" qty="1" desc="4.8TB SSD 2.5"/> 
<sbb part="611-0044-03" desc="4.8TB SSD 2.5" qty="1"/> 
<sbb desc="9.6T SSD/2.5in" part="611-0202-01" qty="1" /> 

Часть Я хочу сортировать является XXXX в «611-XXXX-XX» в в кавычках в строках, например, 611-1111-03 ниже число, чем 611-2222-02 1111 ниже, чем 2222.

Все строки содержат этот номер 611-XXXX-XX и это число всегда начинается с 611.

Это число может произойти вблизи начала строки или ближе к концу. К сожалению, в строке есть еще два набора кавычек, что делает это более сложным.

Выход для этого примера:

<sbb part="611-0044-01" qty="1" desc="4.8TB SSD 2.5"/> 
<sbb part="611-0044-03" desc="4.8TB SSD 2.5" qty="1"/> 
<sbb part="611-0068-01" desc="21.6TB HDD 2.5" qty="1"/> 
<sbb desc="19.2TB SSD/2.5in" part="611-0112-01" qty="1"/> 
<sbb part="611-0112-01" qty="1" desc="19.2TB SSD/2.5in"/> 
<sbb part="611-0112-02" desc="19.2TB SSD/2.5in" qty="1"/> 
<sbb desc="9.6T SSD/2.5in" part="611-0202-01" qty="1" /> 

Я думал о поиске от 611 до следующей цитаты. Не знаю, как это кодировать, хотя я новичок bash.

+0

Каково значение ' Kent

+0

@Kent: В этом случае мой ответ на самом деле встречает его, за исключением порядка 'sbb part =' тегов? Разве этого не хватит? – Inian

ответ

2

Я придумал эту линию:

awk '{t=$0;sub(/.*"611-/,"");sub(/-/,"");sub(/".*/,""); 
     print "1"$0"\x99"t}' file|sort -n|sed 's/.*\x99//' 

выход:

<sbb part="611-0044-01" qty="1" desc="4.8TB SSD 2.5"/> 
<sbb part="611-0044-03" desc="4.8TB SSD 2.5" qty="1"/> 
<sbb part="611-0068-01" desc="21.6TB HDD 2.5" qty="1"/> 
<sbb desc="19.2TB SSD/2.5in" part="611-0112-01" qty="1"/> 
<sbb part="611-0112-01" qty="1" desc="19.2TB SSD/2.5in"/> 
<sbb part="611-0112-02" desc="19.2TB SSD/2.5in" qty="1"/> 
<sbb desc="9.6T SSD/2.5in" part="611-0202-01" qty="1" /> 

Идея:

  • извлечения целевых чисел, поместите их в 1-й столбец (в AWK часть)
  • Передача этого содержания sort -n ov э-э, позвольте ему сделать вид
  • , наконец, удалите 1-й столбец.
  • Обратите внимание, что я использовал \x99, чтобы отделить 1-й столбец и исходные данные, это невидимый разделитель, чтобы упростить его удаление позже.
0

Вот AWK скрипт, который приводит к решению, что гораздо быстрее, чем один, что трубы несколько инструментов вместе.

awk 'BEGIN { split("", r); n=0} /part="611-/ { x=$0; sub(/.*part="611-/, "", x); sub(/".*/, "", x); r[++n]=x "," $0; } END { asort(r); for (i=1; i<=n; i++) { x=r[i]; sub(/^[^,]+,/, "", x); print x }' 
  1. Фильтр для номера детали интереса
  2. Изолировать соответствующий раздел шифра, лавировать его на передней части записи как сортировочный ключ и сохранить в массиве.
  3. В END сортируйте массив, удалите ключ сортировки и распечатайте.
+0

OP вывела желаемый результат. Ваш результат выглядит не так, как он ... возможно, вы хотите сделать какое-то исправление ... – Kent

+0

Kent - Вы абсолютно правы, и я поправлю ... Я почему-то не заметил, что часть не всегда расположена первой в xml .... –