重新打印列并进行修改

问题描述 投票:2回答:6

我有一个看起来像这样的文件:

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 sed cut tr
6个回答
0
投票

你可以用

awk  '{a=$0; sub(/^lbsrv/, "lb", a); print "rename "$0" "a }'

online demo

细节

  • qazxsw poi - 使用整行的值声明临时变量
  • a=$0 - 字符串开头的sub(/^lbsrv/, "lb", a)lbsrv取代
  • qazxsw poi - 打印结果:qazxsw poi,空格,整行,空格,然后是lb变量的内容。

使用print "rename "$0" "a可以实现更简单的解决方案(特别是如果字符串单独出现):

rename

a

这是一个基于BRE POSIX模式的sed命令

  • sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile - 开始一条线
  • this sed demo - substring
  • sed - 第1组:任何0或更多字符,直到行/输入的末尾。

^是一个替换模式,首先取整行,然后附加一个空格,lbsrv,然后是第1组的内容。


1
投票

第一个解决方案:你可以尝试下面的。

\(.*\)

说明:现在添加上述代码的说明。

& lb\1

第二个解决方案:现在添加lb解决方案。

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.

0
投票

其他答案都很好,但只是你可以看到你需要做的就是使用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

0
投票

如果创建输出意味着结束实际重命名文件,您可以改为:

1

将在指定的三个文件上进行前缀重命名(在bash大括号扩展之后)。


0
投票

这可能适合你(GNU sed):

print

使用模式匹配来标识需要复制的行的部分并打印成功匹配,否则删除该行。


0
投票

使用Perl

$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' file

与您的给定输入

$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}
© www.soinside.com 2019 - 2024. All rights reserved.