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

$