Сортировка файла, содержащего разделители строк - PullRequest
0 голосов
/ 26 июня 2018

У меня есть текстовый файл, похожий на

text_a_3   xxx   yyy
- - - - - - - - - - -
text_b_2   xyx   zyz
- - - - - - - - - - - 
text_b_3   xxy   zyy
- - - - - - - - - - -
text_a_2   foo   bar
- - - - - - - - - - -
text_a_1   foo   bla
- - - - - - - - - - -
text_b_1   bla   bla 

Я хочу отсортировать этот файл по номерам, основываясь на первом поле, чтобы мой вывод выглядел следующим образом:

text_a_1   foo   bla
- - - - - - - - - - -
text_a_2   foo   bar
- - - - - - - - - - -
text_a_3   xxx   yyy
- - - - - - - - - - -
text_b_1   bla   bla 
- - - - - - - - - - -
text_b_2   xyx   zyz
- - - - - - - - - - - 
text_b_3   xxy   zyy

Я думал, сортировка сделает эту работу. Я таким образом пытался

sort -n name_of_my_file
sort -k1 -n name_of_my_file

Но это дает

- - - - - - - - - - - 
- - - - - - - - - - - 
- - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - - -
text_a_1   foo   bla
text_a_2   foo   bar
text_a_3   xxx   yyy
text_b_1   bla   bla 
text_b_2   xyx   zyz
text_b_3   xxy   zyy

Опция - разделитель полей не помогает.

Есть ли способ достичь этого с помощью однострочной команды сортировки? Или это единственное решение для извлечения текста, содержащего строки, их сортировки и последующего вставки разделителей строк?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Использование только GNU awk и использование внутренней функции сортировки asort() и разделителя записей, установленного на пунктирную линию:

awk -v RS='- - - - - - - - - - -\n' '
  {a[++c]=$0}
  END{
    asort(a)
    for(i=1;i<=c;i++) 
      printf "%s%s",a[i],(i==c?"":RS)
  }' name_of_my_file

Сценарий сначала заполняет содержимое входного файла в массив a. Когда файл читается, массив сортируется и затем печатается с тем же разделителем входных записей.

0 голосов
/ 26 июня 2018

Когда разделители строк находятся на четных линиях, вы можете использовать

paste -d'\r' - - < yourfile | sort -n | tr '\r' '\n'

Я действительно предпочитаю удалять разделители спереди, сортировать и добавлять их потом, поэтому, пожалуйста, пересмотрите ваши требования:

grep -Ev "(- )*-" yourfile | sort -n | sed 's/$/\n- - - - - - - - - - -/'
0 голосов
/ 26 июня 2018

После sort + awk может вам помочь.

sort -t"_" -k2 -k3 Input_file | awk '/^-/ && !val{val=$0} !/^-/{if(prev){print prev ORS val};prev=$0} END{print prev}'

Теперь добавляем не-лайнерную форму решения.

sort -t"_" -k2 -k3  Input_file |
awk '
/^-/ && !val{
  val=$0}
!/^-/{
  if(prev){
    print prev ORS val};
  prev=$0
}
END{
  print prev
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...