Переместить текст вверх на строку в Unix - PullRequest
0 голосов
/ 26 июня 2018

У меня есть текстовый файл, содержащий набор заданий, которые выглядят так, как показано ниже. Я хотел бы переместить JOB_NAME в строку delete_job:, чтобы каждая работа выглядела как

delete_job: JOB_NAME

Я пробовал много способов, но не могу заставить его работать! Есть идеи, как этого достичь?

delete_job:
JOB_NAME
job_type: BOX
description: "*******"
date_conditions: 0
owner: *******
alarm_if_fail: 1

Ответы [ 7 ]

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

С paste, head и tail:

$ (head -n2 | paste -d' ' -s; tail -n+1) < filename.txt
0 голосов
/ 26 июня 2018

Правильный способ сделать это с помощью awk (при условии нескольких возможных строк «action_job») - просто сохранить строку «action_job», когда вы ее видите, а затем распечатать ее в качестве префикса при печати следующей строки:

awk '/(delete|update|insert)_job/{act=$0 OFS; next} {print act $0; act=""}'
0 голосов
/ 26 июня 2018

Сед раствор:

sed '/^delete_job:$/{N;s/\n/ /;}' filename
0 голосов
/ 26 июня 2018

Со старым добрым изд:

ed infile <<'EOE'
g/^delete_job:$/ s/$/ /\
.,+j
wq
EOE

Собирает все строки, соответствующие ^delete_job:$ с глобальной командой g//; s/$/ / добавляет пробел к этой строке, а .,+j соединяет его со следующей строкой, прежде чем wq записывает буфер в файл и завершает работу.

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

РЕДАКТИРОВАТЬ 2: В соответствии с предложением ED сэр добавив еще 1 решение сейчас.

awk 'val{print val OFS $0;val="";next}/delete_job/||/update_job/||/insert_job/{val=$0;next} 1' Input_file

РЕДАКТИРОВАТЬ: как OP сказал, что многие строки могут быть там для поиска, поэтому теперь меняется соответственно.

awk '/delete_job/||/update_job/||/insert_job/{val=$0;getline;print val OFS $0;next} 1' Input_file

Не могли бы вы попробовать и сообщите мне, поможет ли это вам.

awk '/delete_job/{val=$0;getline;print val OFS $0;next} 1'  Input_file
0 голосов
/ 26 июня 2018

два других awk с

$ awk '/^delete_job:/{printf "%s", $0 OFS; next}1' file

или

$ awk '{ORS=/^delete_job:/?OFS:RS}1' file
0 голосов
/ 26 июня 2018

Я бы использовал awk, возможно что-то вроде

<yourfile awk '
BEGIN { output = 1 }
/delete_job:/ { output = 0; next; }
output == 0 { print "delete_job: " $0; output = 1; next; }
output == 1 { print }' > newfile

Может быть, это помогает. Результат будет записан в новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...