awk,设置FS =“,”似乎不起作用,是否有我应该知道的警告?

时间:2012-05-08 16:33:44

标签: awk

好的,所以我想写一个简单的awk来清除我的一些csv文件的逗号。

以下是几行示例数据

  PRD,,,,PEWPRV100D,,,EWPRVU457D,,,,12/31/2011  10:09:14 PM,,,,,5,,,4,,
  PRD,,,,PEWPRV100D,,,EWPRVU250D,,,,12/31/2011  10:09:23 PM,,,,,67,,,69,,
  PRD,,,,PEWREF100D,,,EWREFU045D,,,,12/31/2011  10:09:40 PM,,,,,7,,,5,,
  PRD,,,,PEWPRV100D,,,EWPRVU191D,,,,12/31/2011  10:09:40 PM,,,,,6,,,5,,

作为一个简单的第一步,我想要执行此操作(我最终想要做的更复杂但这是我需要做的第一件事,我甚至无法做到这一点:()

   PRD,PEWPRV100D,EWPRVU457D,12/31/2011  10:09:14 PM,5,4,
   PRD,PEWPRV100D,EWPRVU250D,12/31/2011  10:09:23 PM,67,69,
   PRD,PEWREF100D,EWREFU045D,12/31/2011  10:09:40 PM,7,5,
   PRD,PEWPRV100D,EWPRVU191D,12/31/2011  10:09:40 PM,6,5,

这是我第一次尝试使用awk脚本

  #!/bin/awk 
  BEGIN{FS=",";} 
  {print $0,$4,$7,$11,$16,$19 }
  END{print "DONE"}

产生

  PRD,,,,PEWPRV100D,,,EWPRVU457D,,,,12/31/2011  10:09:14 PM,,,,,5,,,4,,,,,,,
  PRD,,,,PEWPRV100D,,,EWPRVU250D,,,,12/31/2011  10:09:23 PM,,,,,67,,,69,,,,,,,
  PRD,,,,PEWREF100D,,,EWREFU045D,,,,12/31/2011  10:09:40 PM,,,,,7,,,5,,,,,,,
  PRD,,,,PEWPRV100D,,,EWPRVU191D,,,,12/31/2011  10:09:40 PM,,,,,6,,,5,,,,,,,

我试过的一个更有说服力的剧本:

  #!/bin/awk 
  BEGIN{FS=",";} 
  {printf("$$%s$$", $0) }
  END{print "DONE"} 

产生

 $$PRD,,,,PEWPRV100D,,,EWPRVU457D,,,,12/31/2011  10:09:14 PM,,,,,5,,,4,,$$
  $$PRD,,,,PEWPRV100D,,,EWPRVU250D,,,,12/31/2011  10:09:23 PM,,,,,67,,,69,,$$
  $$PRD,,,,PEWREF100D,,,EWREFU045D,,,,12/31/2011  10:09:40 PM,,,,,7,,,5,,$$
  $$PRD,,,,PEWPRV100D,,,EWPRVU191D,,,,12/31/2011  10:09:40 PM,,,,,6,,,5,,$$

显示(我认为)FS =“,”没有将分隔符设置为逗号,因为整行被视为一列。我也试过很多不同形式的那条线,似乎没有什么区别。 awk实现的手册页说FS是我应该设置的var。我也尝试了hte -F标志,这也没有帮助。

这里有什么显而易见的东西吗?

1 个答案:

答案 0 :(得分:3)

awk中,$0不是第一列 - 它是整行。 $1是第一列,第二列是$2,依此类推。因此,你可能想改变这个:

{print $0,$4,$7,$11,$16,$19 }

到此:

{print $1,$5,$8,$12,$17,$20 }