2016-03-17 3 views
-3

Что такое умный и чистый/сжатый способ перестановки полей, соответствующих критерию? Для моих целей, записи могут быть блоки разделены пустыми строками, например .:Один вкладыш для переупорядочения полей для соответствующего элемента

apple 
banana 
12345 
carrot 

donut 
98765 
eggplant 

или табуляцией, например,

apple banana 12345 carrot 
donut 98765 eggplant 

В любом случае, предположим, что я ищу шаблон /[0-9]{5}/. Если это согласовано, я хочу перенести его на первую запись. Это дало бы следующее:

12345 
apple 
banana 
carrot 

98765 
donut 
eggplant 

или табуляцией, например,

12345 apple banana carrot 
98765 donut eggplant 

Там нет необходимости поддерживать оба формата. Они взаимозаменяемы для меня.

One-liner preferred.

+1

Извините, это не сайт «напишите мой код для меня». Вы должны приложить некоторые усилия для решения проблемы самостоятельно. –

+0

Джим, я понимаю, почему так может показаться, но проблема здесь делает это в одной строке. Я могу придумать множество способов сделать это с помощью небольших скриптов, но я не могу понять, как это сделать с помощью нескольких труб или символов. Возможно, мне следовало бы уточнить важность однострочного лайнера. Я просто не сказал этого, потому что супер-короткий скрипт обычно можно преобразовать в однострочный. –

+0

'awk '/^[0-9] + $/{printf $ 0" \ t "; next} {if ($ 0 ~/^ $ /) {print block; block = ""} else {block = block $ 0 "\ t"}} END {print block} '' – dawg

ответ

0

Для вас первый, например, один вкладыш, который будет работать будет:

perl -00 -pe "s/\A(.*?)^(\d{5}\n)/$2$1/sm" j1.txt 

Для запуска на системе UNIX, заменить двойные кавычки одинарные кавычки.

Обновление: выполнено 2 изменения в регулярном выражении.

+0

Привет Крис. Это действительно приятно, и спасибо за советы по поводу одиночных кавычек. Это элегантно с/см. Я плохо разбираюсь в многострочном регулярном выражении. И я не знал о -00 использовать пустые строки в качестве разделителя записей. –

+0

Кроме того, Крис, можете ли вы взглянуть на мой родственный вопрос? http://stackoverflow.com/questions/36051094/how-to-sort-fields-in-a-record?noredirect1_comment59750407_36051094 (я не знаю, почему я получаю пламя с низкими голосами, кстати. I подумал, что это были и интересные проблемы.) Помогает ли -00 трюк в блоках текста? –

+0

@MichaelDouma: Вы получаете downvotes, потому что вы, кажется, не прилагали никаких усилий для решения этой проблемы для себя. Когда вы написали какой-то код, но не можете заставить его работать независимо от того, что вы пытаетесь, настало время опубликовать его в Stack Overflow и попросить о помощи в его работе. Люди обычно смутно рассматривают вопросы, в которых ваш подход к решению проблем - просто свалить вашу работу здесь, не добавив к ней вообще – Borodin

1
awk 'function out() {if (x) {print x; x="";}} 
    NF==0 {out(); print; next} 
    /^[0-9]{5}$/ {print; out(); next} 
    {x=x?(x RS $0):$0} 
    END {out()}' 
1

Для всех на одной линии версии, попробуйте (непроверенные):

perl -pi -wle's/^(.*?) ([0-9]{5}(?![^ ]))(.*)/$2 $1$3/' 

Предполагая, что вы хотите только 5 цифр, который нужно переместить, а не что-то содержащий 5 цифр.

Смежные вопросы