Gawk / If / Printf /列中的所有内容

时间:2014-05-20 15:50:47

标签: 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
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

我希望普利茅斯的线与其他细节一样在同一列上

2 个答案:

答案 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 awksome 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
相关问题