在Unix中将文本上移一行

时间:2018-06-26 14:46:45

标签: unix awk sed grep

我有一个文本文件,其中包含一系列类似于以下作业的作业。我想做的就是将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 :(得分:1)

EDIT2: 根据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

答案 1 :(得分:1)

编辑得不错,

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

这将收集所有与^delete_job:$g//全局命令匹配的行; s/$/ /会在该行后面添加一个空格,.,+j将其与下一行连接起来,然后wq将缓冲区写回到文件并退出。

答案 2 :(得分:1)

sed解决方案:

sed '/^delete_job:$/{N;s/\n/ /;}' filename

答案 3 :(得分:1)

用awk做到这一点的正确方法(假设有多个可能的“ action_job”行)是只在看到时保存“ action_job”行,然后在打印下一行时将其打印为前缀:< / p>

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

答案 4 :(得分:0)

我会用awk,也许是这样的

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

也许有帮助。结果将被写入newfile。

答案 5 :(得分:0)

另外两个def index(request): foos = Foo.objects.all() foo_barform_pairs = [] for foo in foos: foo_barform_pairs.append((foo, BarForm(initial={'name': foo.bar.name, 'num': foo.bar.num}))) return render(request, 'foo_list.html', {"foo_barform_pairs": foo_barform_pairs}

at net.corda.testing.driver.DriverParameters.<init>(Driver.kt)   
at com.example.NodeDriver.main(NodeDriver.java:32)
[quasar] ERROR: java/lang/Object
java.lang.IllegalArgumentException

awk

答案 6 :(得分:0)

使用pasteheadtail

$ (head -n2 | paste -d' ' -s; tail -n+1) < filename.txt