SED Замена пробелов только между переменными, использование регулярных выражений - PullRequest
2 голосов
/ 04 марта 2020

Я недавно столкнулся с непростой ситуацией, когда проводил анализ логов, я не эксперт по REGEX, поэтому просто хотел опубликовать здесь и посмотреть, получу ли я какое-нибудь хорошее решение

проблема: Ниже Я вставил результат, полученный при выполнении команды awk и grep в файл журнала unix. используя awk | sort | uniq - c

          `2851 ABC=10087 ACG=123 RMC=17`
          `2851 ABC=10087 ACG=123 RMC=17`
          `1323 ABC=10087 ACG=123 RMC=10`
          `1323 ABC=10087 ACG=123 RMC=20`
          `1323 ABC=10087 ACG=123 RMC=20`
           `248 ABC=10087 ACG=123 RMC=8`
           `248 ABC=10087 ACG=123 RMC=8`
           `236 ABC=10087 ACG=123 RMC=7`
           `127 ABC=10087 ACG=123 RMC=16`
           `127 ABC=10087 ACG=123 RMC=16`
            `67 ABC=10087 ACG=123 RMC=1`

Я передал этот вывод выше ("|") и применил к нему команду sed для сортировки 7-го файла (т.е. RM * 1031) * значения в порядке убывания), поэтому я использовал это

sed's / = / / g '| sort -rnk 7,7 .

После сортировки значения i снова изменил внешний вид, чтобы он выглядел как предыдущий, поэтому я повторно применил sed, который использовал,

sed 's / = / / g' | sort -rnk 7,7 | sed 's / / = / g '

Это то, что я ожидал

       `1323 ABC=10087 ACG=123 RMC=20`
       `1323 ABC=10087 ACG=123 RMC=20`
       `2851 ABC=10087 ACG=123 RMC=17`
       `2851 ABC=10087 ACG=123 RMC=17`
        `127 ABC=10087 ACG=123 RMC=16`
        `127 ABC=10087 ACG=123 RMC=16`
       `1323 ABC=10087 ACG=123 RMC=10`
        `248 ABC=10087 ACG=123 RMC=8`
        `248 ABC=10087 ACG=123 RMC=8`
        `236 ABC=10087 ACG=123 RMC=7`
         `67 ABC=10087 ACG=123 RMC=1`

, но мой вывод выглядит примерно так

    `===1323=ABC=10087=ACG=123=RMC=20`
    `===1323=ABC=10087=ACG=123=RMC=20`
    `===2851=ABC=10087=ACG=123=RMC=17`
    `===2851=ABC=10087=ACG=123=RMC=17`
    `====127=ABC=10087=ACG=123=RMC=16`
    `====127=ABC=10087=ACG=123=RMC=16`
    `===1323=ABC=10087=ACG=123=RMC=10`
    `====248=ABC=10087=ACG=123=RMC=8`
    `====248=ABC=10087=ACG=123=RMC=8`
    `====236=ABC=10087=ACG=123=RMC=7`
    `=====67=ABC=10087=ACG=123=RMC=1`

Как мне добиться желаемого результата?

Ответы [ 5 ]

2 голосов
/ 04 марта 2020

Я избавился от неприятных ощущений, потому что это меня портило. Вы можете попробовать

$ echo "2851 ABC=10087 ACG=123 RMC=17
2851 ABC=10087 ACG=123 RMC=17
1323 ABC=10087 ACG=123 RMC=10
1323 ABC=10087 ACG=123 RMC=20
1323 ABC=10087 ACG=123 RMC=20
248 ABC=10087 ACG=123 RMC=8
248 ABC=10087 ACG=123 RMC=8
236 ABC=10087 ACG=123 RMC=7
127 ABC=10087 ACG=123 RMC=16
127 ABC=10087 ACG=123 RMC=16
67 ABC=10087 ACG=123 RMC=1"| sed 's/=/ / g' |sort -rnk 7,7| sed -e 's/ /=/2' -e 's/ /=/3' -e 's/ /=/4'

Что дает мне

1323 ABC=10087 ACG=123 RMC=20
1323 ABC=10087 ACG=123 RMC=20
2851 ABC=10087 ACG=123 RMC=17
2851 ABC=10087 ACG=123 RMC=17
127 ABC=10087 ACG=123 RMC=16
127 ABC=10087 ACG=123 RMC=16
1323 ABC=10087 ACG=123 RMC=10
248 ABC=10087 ACG=123 RMC=8
248 ABC=10087 ACG=123 RMC=8
236 ABC=10087 ACG=123 RMC=7
67 ABC=10087 ACG=123 RMC=1
2 голосов
/ 04 марта 2020

Вам нужна только сортировка с параметром -t:

sort -t = -rnk 4

Если вы скажете, чтобы сортировка принимала знак равенства в качестве разделителя полей, это работает.

2 голосов
/ 04 марта 2020

Почему sed , если вы можете сделать это?

echo "$response" | sort -t '=' -nr -k4
1323 ABC=10087 ACG=123 RMC=20
1323 ABC=10087 ACG=123 RMC=20
2851 ABC=10087 ACG=123 RMC=17
2851 ABC=10087 ACG=123 RMC=17
127 ABC=10087 ACG=123 RMC=16
127 ABC=10087 ACG=123 RMC=16
1323 ABC=10087 ACG=123 RMC=10
248 ABC=10087 ACG=123 RMC=8
248 ABC=10087 ACG=123 RMC=8
236 ABC=10087 ACG=123 RMC=7
67 ABC=10087 ACG=123 RMC=1

С уважением!

0 голосов
/ 05 марта 2020

Это может сработать для вас (GNU sed):

sed 's/.*=\(.*\)/\1\t&/' file |
sort -nr |
sed 's/.*\t//'

Добавить ключ (ы) для сортировки в начало строки, отсортировать, удалить ключ (ы).

В этом случае, однако, ответов Матиаса Барра ios и Оливера Гайды достаточно.

0 голосов
/ 04 марта 2020

Проблема в том, что ваши последние sed меняют каждый пробел на =. Вместо этого попробуйте

sed 's/=/ / g' |sort -rnk 7,7 |sed 's/RMC /RMC=/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...