Awk 修改后重印专栏
我有一个文件如下所示:Awk 修改后重印专栏,awk,sed,cut,tr,Awk,Sed,Cut,Tr,我有一个文件如下所示: lbsrv_standards-d lbsrv_standards-t lbsrv_standards 期望输出: rename lbsrv_standards-d lb_standards-d rename lbsrv_standards-t lb_standards-t rename lbsrv_standards lb_standards 因此,我需要打印$1,一个空格,然后打印$1的修改版本,我一直在使用awk,但如果不在原始和修改的$1之间添加换行符,我无法
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards
期望输出:
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
因此,我需要打印$1,一个空格,然后打印$1的修改版本,我一直在使用awk,但如果不在原始和修改的$1之间添加换行符,我无法计算出替换
解决方案:
awk '{print "rename "$1} ; { gsub("lbsrv", "lb", $1) ; print }'
输出:
rename lbsrv_standards-d
lb_standards-d
rename lbsrv_standards-t
lb_standards-t
rename lbsrv_standards
lb_standards
如有任何协助,将不胜感激
谢谢您可以使用
awk '{a=$0; sub(/^lbsrv/, "lb", a); print "rename "$0" "a }'
见
详细信息
-用整行的值声明一个临时变量a=$0
-字符串开头的sub(/^lbsrv/,“lb”,a)
替换为lbsrv
lb
-打印结果:print“rename”$0”a
,空格,整行,空格,然后是rename
变量的内容李>a
sed
(尤其是字符串单独输入时)可以实现更简单的解决方案:
看
这是一个基于BRE POSIX模式的sed
命令,用于查找
-行的开头^
-子字符串lbsrv
-第1组:行/输入结束前的任何0个或更多字符\(.*)
&lb\1
是一种替换模式,它首先占用整行,然后添加一个空格,lb
,然后是组1的内容。第一种解决方案:请尝试以下内容
awk 'BEGIN{FS="_"}{print "rename",$0,"lb_"$2}' Input_file
解释:现在添加上述代码的解释
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section here.
FS="_" ##Setting field separator as _ here.
} ##Closing BEGIN section of awk command here.
{
print "rename",$0,"lb_"$2 ##Printing string rename then complete line then lb_ string with 2nd column here as per OP need.
}' Input_file ##Mentioning Input_file name here.
第二个解决方案:立即添加sed
解决方案
sed 's/\([^_]*\)_\(.*\)/rename \1_\2 lb_\2/' Input_file
输出如下
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
其他答案很好,但是您可以看到,您需要做的只是使用
printf
而不是print
:
$ awk '{printf "rename %s ", $1} ; { gsub("lbsrv", "lb", $1) ; print }' file
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
当然,通常情况下,您会在单个操作中组合这些命令:
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb", $1) ; print }' file
另外,gsub
在默认情况下对$0
进行操作,现在流行使用尾随1
而不是打印
,因此最后:
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' file
如果创建输出意味着结束实际重命名文件,则可以改为执行以下操作:
$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}
将对指定的三个文件进行前缀重命名(在bash大括号展开之后)。这可能适合您(GNU-sed):
使用模式匹配识别行中需要复制的部分并打印成功的匹配,否则使用Perl删除该行。
perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g '
使用您给定的输入
$ cat jim.txt
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards
$ perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g ' jim.txt
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
$
perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g '
$ cat jim.txt
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards
$ perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g ' jim.txt
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
$