在Unix中将文本上移一行

在Unix中将文本上移一行,unix,awk,sed,grep,Unix,Awk,Sed,Grep,我有一个文本文件,其中包含一组作业,看起来像下面的作业。我想做的是将JOB_名称移动到delete_JOB:行中,使每个JOB看起来像 delete_job: JOB_NAME 我试过很多方法,但都没能成功!有什么办法可以做到这一点吗 delete_job: JOB_NAME job_type: BOX description: "*******" date_conditions: 0 owner: ******* alarm_if_fail: 1 我会用awk,也许类似的 <your

我有一个文本文件,其中包含一组作业,看起来像下面的作业。我想做的是将JOB_名称移动到delete_JOB:行中,使每个JOB看起来像

delete_job: JOB_NAME
我试过很多方法,但都没能成功!有什么办法可以做到这一点吗

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

我会用awk,也许类似的

<yourfile awk '
BEGIN { output = 1 }
/delete_job:/ { output = 0; next; }
output == 0 { print "delete_job: " $0; output = 1; next; }
output == 1 { print }' > newfile
也许这会有帮助。结果将写入新文件。

另外两个AWK

EDIT2:根据ED先生的建议,现在再添加一个解决方案

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
与好老埃德:

ed infile <<'EOE'
g/^delete_job:$/ s/$/ /\
.,+j
wq
EOE
这将使用g//global命令收集与^delete_job:$匹配的所有行;s/$//在该行追加一个空格,,+j将其与下一行连接,然后wq将缓冲区写回文件并退出。

sed解决方案:

sed '/^delete_job:$/{N;s/\n/ /;}' filename
使用粘贴、头和尾:


假设有多个可能的action_作业行,使用awk执行此操作的正确方法是,在看到action_作业行时只保存它,然后在打印下一行时将其打印为前缀:

awk '/(delete|update|insert)_job/{act=$0 OFS; next} {print act $0; act=""}'

嗨,老兄,第一个很好,非常感谢!是否可以对delete_作业进行通配符:delete/update/insert之间有时会有所不同?谢谢again@CameronCharlton,请检查我的编辑解决方案一次,并让我知道这是否对您有帮助?@CameronCharlton,这应该是初始问题的一部分。@RavinderSingh13是的,这很有效!谢谢你,伙计,我们一整天都搞不清楚,这已经不到30分钟了,我下次就直接过来了。。。干杯。@CameronCharlton,不是问题,巴迪快乐学习,继续学习,干杯:不要这样做,这是错误的方法,因为它可能会悄悄地失败,并且在您的需求发生变化时很难增强。请参阅。作为一个简单的困难增强示例-尝试添加一条语句将每个输入行打印到stderr,例如用于调试,请注意,如果您有一个getline解决方案,您需要在两个单独的位置添加打印,与非getline解决方案一样,您只需在脚本前面添加一个打印。@EdMorton,谢谢先生,请检查我的最新编辑解决方案,并提供您的指导,如果现在看起来不错的话?第一个脚本不再有getline问题,它现在只是有点长,比它必须的更复杂,请参阅。我正在删除我的否决票。++ve对于不错的解决方案,似乎我的解决方案的逻辑看起来也很接近,干杯,谢谢分享。
sed '/^delete_job:$/{N;s/\n/ /;}' filename
$ (head -n2 | paste -d' ' -s; tail -n+1) < filename.txt
awk '/(delete|update|insert)_job/{act=$0 OFS; next} {print act $0; act=""}'