Linux 带$0的AWK使用sed将模式替换为新字符串
我有一个包含多个作业内容的文件,如:Linux 带$0的AWK使用sed将模式替换为新字符串,linux,awk,sed,Linux,Awk,Sed,我有一个包含多个作业内容的文件,如: insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD command: $ADM_BIN/pear_generic_wrapper.ksh owner: gpadmin permission: 在这里,我需要为每个insert_作业添加一行,如下所示: insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD condition:
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD
command: $ADM_BIN/pear_generic_wrapper.ksh
owner: gpadmin
permission:
在这里,我需要为每个insert_作业添加一行,如下所示:
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD
condition: 18132_D_DS_PEAR_AUTORECON
因此,基本上有两个步骤(首先复制行作业名称;然后在作为条件打印的第二个复制行中将18132_TAL_
替换为18132_
)
为此,我对每个insert_作业行执行以下操作:
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON
现在,要更新第2行以将insert_作业替换为condition,并将18132_TAL_
替换为18132_
,我被卡住了
我正在尝试编写类似以下内容的代码:
$ cat input.dat | awk '($0!~"job_type") {print $0|sed "s/insert_job/condition/"} 1'
但是,sed在这里不起作用,它给出了语法错误
在打印$0后,您能否帮助了解使用sed的正确语法
awk '
/insert_job/{
val=$2
sub(/_[^_]*/,"",val)
$0=$0 ORS "condition: " val
val=""
}
1
' Input_file
解释:为上述代码添加解释
awk ' ##Starting awk code from here.
/insert_job/{ ##Checking condition if string insert_job is found in a line then do following.
val=$2 ##Creating variable val whose value is $2(2nd field) of current line.
sub(/_[^_]*/,"",val) ##Substituting _ till next occurrence of _ with NULL in val here.
$0=$0 ORS "condition: " val ##Concatenating ORS(new line) then string condition and variable val here.
val="" ##Nullifying variable val here.
}
1 ##1 will print edited/non-edited line here.
' Input_file ##Mentioning Input_file name here.
输出如下:
你能试试下面的吗
awk '
/insert_job/{
val=$2
sub(/_[^_]*/,"",val)
$0=$0 ORS "condition: " val
val=""
}
1
' Input_file
解释:为上述代码添加解释
awk ' ##Starting awk code from here.
/insert_job/{ ##Checking condition if string insert_job is found in a line then do following.
val=$2 ##Creating variable val whose value is $2(2nd field) of current line.
sub(/_[^_]*/,"",val) ##Substituting _ till next occurrence of _ with NULL in val here.
$0=$0 ORS "condition: " val ##Concatenating ORS(new line) then string condition and variable val here.
val="" ##Nullifying variable val here.
}
1 ##1 will print edited/non-edited line here.
' Input_file ##Mentioning Input_file name here.
输出如下:
这就是你想做的吗
$ awk '
{ print }
sub(/^insert_job/,"condition") {
sub(/_TAL/,"")
print $1, $2
}
' file
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD
condition: 18132_D_DS_PEAR_AUTORECON
command: $ADM_BIN/pear_generic_wrapper.ksh
owner: gpadmin
permission:
当您使用awk时,您永远不需要sed,而且awk不是一个shell,它是一个完全独立的工具,有自己的语言、语法和语义,所以您不应该尝试使用shell语法从中调用其他UNIX工具。您正试图这样做吗
$ awk '
{ print }
sub(/^insert_job/,"condition") {
sub(/_TAL/,"")
print $1, $2
}
' file
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD
condition: 18132_D_DS_PEAR_AUTORECON
command: $ADM_BIN/pear_generic_wrapper.ksh
owner: gpadmin
permission:
当您使用awk时,您永远不需要sed,而且awk不是一个shell,它是一个完全独立的工具,有自己的语言、语法和语义,因此您不应该试图使用shell语法从中调用其他UNIX工具。工作得很好。谢谢效果很好。谢谢