Gawk/If/Printf/在列中打印所有内容
谁能告诉我如何解决这个问题:Gawk/If/Printf/在列中打印所有内容,awk,gawk,Awk,Gawk,谁能告诉我如何解决这个问题: 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 hon
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
我希望普利茅斯的行与其他细节一样位于同一列上在分析行时,Awk忽略所有分隔符(如变量
FS
中设置的)
如果您更改任何字段,Awk将通过使用OFS拼接字段(列),而不是使用默认的单个空格字符,将行重新创建为$0
(隐式调用print()
,不带参数)
您可以尝试将OFS设置为制表符,如下所示:
BEGIN { OFS = "\t" }
如果幸运的话,没有超过7个字符的标识符(这在原始文件中似乎是正确的),那么它可以工作
但是,如果您需要特殊的列宽,例如因为“普利茅斯”现在更长了,则需要使用printf()
,例如:
{ printf("%-10s %-7s %-7s %-3s %s\n", $1, $2, $3, $4, $5) }
有关更多信息,请参见您的
man awk
或。在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
普利茅斯是8个字符是的,我的意思是在原始文件中。看起来它最初使用的标签使事情变得更容易。在新文件中,您可能需要使用
printf()
方法将其保留在列中。这会导致制表符过多。《愤怒》现在在《黑暗之柱》中1999@user3657270它不需要太多的选项卡,只使用一个默认选项卡。要解决此问题,您需要使用列-t
将其正确对齐。@user3657270是。awk'{if($1==“plym”)sub(/plym/,“&outh”);{print}
这可以缩短为:awk'$1==“plym”{sub(/plym/,“&outh”)}1
与我的解决方案相比,唯一的区别是这不会将plymando
更改为plymandooth
,我的会。