重新修改列

时间:2019-02-28 18:38:13

标签: 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和修改后的$ 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

任何帮助将不胜感激

谢谢

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用

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

请参见online demo

详细信息

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

使用sed可以实现更简单的解决方案(尤其是如果字符串是单独输入的话):

sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile

请参见this sed demo

这是一个基于BRE POSIX模式的sed命令,可以找到

  • ^-一行的开头
  • lbsrv-子字符串
  • \(.*\)-第1组:直到行/输入末尾的0个或更多字符。

& lb\1是一种替换模式,它首先占据整行,然后附加一个空格lb,然后附加第1组的内容。

答案 2 :(得分:0)

其他答案也很好,但是您可以看到您需要做的就是使用import Foundation import UIKit import MaterialComponents class SectionHeaderAppointment:UICollectionReusableView { var sectionHeaderlabel: UILabel! var nameflatButton:MDCButton! override init(frame: CGRect) { super.init(frame: frame) configure() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func layoutSubviews() { super.layoutSubviews() print("Rotation") sectionHeaderlabel.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height) nameflatButton.frame = CGRect(x: (frame.width - (frame.width/3))/2, y: 6, width: frame.width/3, height: frame.height - 8) } } 而不是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很流行,所以最后:

print

答案 3 :(得分:0)

如果创建输出意味着实际上要重命名文件,则可以改为:

$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}

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

答案 4 :(得分:0)

这可能对您有用(GNU sed):

sed 's/lbsrv\(.*\)/rename & lb\1/p;d' file

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

答案 5 :(得分:0)

使用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

$