Интересно, могут ли sed или awk изменить порядок, используя номер строки

В настоящее время у меня есть текстовый файл, который начинается так:

ATOM    277  N   DOPC    3       2.637   5.546  17.667  1.00  0.00      MEMB
ATOM    278  C12 DOPC    3       2.869   5.398  19.176  1.00  0.00      MEMB
ATOM    279 H12A DOPC    3       3.729   6.005  19.418  1.00  0.00      MEMB
ATOM    280 H12B DOPC    3       3.176   4.394  19.427  1.00  0.00      MEMB
ATOM    281  C13 DOPC    3       1.352   4.873  17.275  1.00  0.00      MEMB
ATOM    282 H13A DOPC    3       1.380   5.091  16.217  1.00  0.00      MEMB
ATOM    283 H13B DOPC    3       1.415   3.810  17.452  1.00  0.00      MEMB
ATOM    284 H13C DOPC    3       0.491   5.261  17.799  1.00  0.00      MEMB
ATOM    285  C14 DOPC    3       3.791   4.845  16.976  1.00  0.00      MEMB
ATOM    286 H14A DOPC    3       4.692   4.989  17.554  1.00  0.00      MEMB
ATOM    287 H14B DOPC    3       3.563   3.790  17.025  1.00  0.00      MEMB
ATOM    288 H14C DOPC    3       3.875   5.097  15.930  1.00  0.00      MEMB
ATOM    289  C15 DOPC    3       2.627   6.991  17.324  1.00  0.00      MEMB
ATOM    290 H15A DOPC    3       1.812   7.530  17.785  1.00  0.00      MEMB
.
.

Мне интересно, есть ли способ с помощью sed или awk изменить порядок строк, чтобы порядок шел от [1,2,3...14...] до [1,2,5,9,13,3 ,4,6,7,8,10,11,12,14...], просто используя их уникальный номер строки?

Вот желаемый результат,

ATOM    277  N   DOPC    3       2.637   5.546  17.667  1.00  0.00      MEMB
ATOM    278  C12 DOPC    3       2.869   5.398  19.176  1.00  0.00      MEMB
ATOM    281  C13 DOPC    3       1.352   4.873  17.275  1.00  0.00      MEMB
ATOM    285  C14 DOPC    3       3.791   4.845  16.976  1.00  0.00      MEMB
ATOM    289  C15 DOPC    3       2.627   6.991  17.324  1.00  0.00      MEMB
ATOM    279 H12A DOPC    3       3.729   6.005  19.418  1.00  0.00      MEMB
ATOM    280 H12B DOPC    3       3.176   4.394  19.427  1.00  0.00      MEMB
ATOM    284 H13C DOPC    3       0.491   5.261  17.799  1.00  0.00      MEMB
ATOM    286 H14A DOPC    3       4.692   4.989  17.554  1.00  0.00      MEMB
ATOM    287 H14B DOPC    3       3.563   3.790  17.025  1.00  0.00      MEMB
ATOM    288 H14C DOPC    3       3.875   5.097  15.930  1.00  0.00      MEMB
ATOM    290 H15A DOPC    3       1.812   7.530  17.785  1.00  0.00      MEMB
.
.

Спасибо!

Ваш вопрос не ясен, пожалуйста, добавьте логику, с помощью которой вы хотите получить результат. Также добавьте свои усилия, которые настоятельно рекомендуются для SO, вместе с образцом вывода в CODE TAGS в вашем вопросе.

RavinderSingh13 13.12.2020 17:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В авке:

$ awk -v order = "1,2,5,9,13,3,4,6,7,8,10,11,12,13,14" '{
    a[NR]=$0              # hash records to a with NR as index
}
END { 
    n=split(order,o,/,/)  # split the given order to a mapping
    for(i=1;i<=n;i++) {   # iterate the map indexes
        print a[o[i]]     # output
        # delete a[o[i]]  # uncomment these
    }
    # for(i=1;i<=NR;i++)  # to print any leftovers
    #     if (i in a)      # that were not in the order list
    #         print a[i]
}' file

Хм, он выдает ошибочный вывод. Ах да, в вашем заказе 13 дважды.

James Brown 13.12.2020 18:17

Спасибо! Извините, дополнительные 13 - это опечатка. Я исправил это, извините!

user10713428 13.12.2020 18:40
Ответ принят как подходящий

Используйте этот однострочный Perl:

perl -ne 'push @a, $_; END { print $a[$_-1] for ( 1,2,5,9,13,3,4,6,7,8,10,11,12,13,14, 15..($#a+1) ); }' in_file > out_file

Однострочник Perl использует следующие флаги командной строки:
-e: говорит Perl искать код в строке, а не в файле.
-n : перебирать ввод по одной строке за раз, по умолчанию назначая его $_.

push @a, $_; : добавить в массив @a (который изначально пуст) текущую строку в качестве следующего элемента.
$#a : индекс последнего элемента массива @a.
END { ... }: После того, как все входные строки будут прочитаны, выполните код внутри блока. Здесь выведите строки в указанном порядке.

Другие вопросы по теме