有人可以告诉我如何解决这个问题:
plym fury 1970 73 2500
chevy malibu 1999 60 3000
ford mustang 1965 45 10000
volvo s80 1998 102 9850
ford thundbd 2003 15 10500
chevy malibu 2000 50 3500
bmw 325i 1985 115 450
honda accord 2001 30 6000
ford taurus 2004 10 17000
toyota rav4 2002 180 750
chevy impala 1985 85 1550
ford explor 2003 25 9500
命令:
gawk '{if ($1=="plym")($1="plymouth")};{print}' cars
结果:
plymouth fury 1970 73 2500
chevy malibu 1999 60 3000
ford mustang 1965 45 10000
volvo s80 1998 102 9850
ford thundbd 2003 15 10500
chevy malibu 2000 50 3500
bmw 325i 1985 115 450
honda accord 2001 30 6000
ford taurus 2004 10 17000
toyota rav4 2002 180 750
chevy impala 1985 85 1550
ford explor 2003 25 9500
我希望普利茅斯的线与其他细节一样在同一列上
答案 0 :(得分:1)
解析该行时,Awk会忽略所有分隔符(在变量FS
中设置)。
如果您更改任何字段,则通过使用$0
拼接字段(列),将awk重新创建为print()
(隐含在您的OFS
无需参数的调用中),这是默认情况下只是一个空格字符。
您可能会尝试将OFS
设置为标签字符,如下所示:
BEGIN { OFS = "\t" }
如果你很幸运并且没有标识符超过7个字符(在原始文件中似乎是真的),它可以工作。
但是如果你需要特殊的列宽,例如因为"普利茅斯"现在更长,你需要使用printf()
代替,例如:
{ printf("%-10s %-7s %-7s %-3s %s\n", $1, $2, $3, $4, $5) }
有关详细信息,请参阅man awk
或some web variant of it。
答案 1 :(得分:0)
保留sub
awk
的标签格式
awk '{sub(/plym/,"&outh")}1' file | column -t
plymouth fury 1970 73 2500
chevy malibu 1999 60 3000
ford mustang 1965 45 10000
volvo s80 1998 102 9850
ford thundbd 2003 15 10500
chevy malibu 2000 50 3500
bmw 325i 1985 115 450
honda accord 2001 30 6000
ford taurus 2004 10 17000
toyota rav4 2002 180 750
chevy impala 1985 85 1550
ford explor 2003 25 9500