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
,我的会。