【问题标题】:setting the output field separator in awk在 awk 中设置输出字段分隔符
【发布时间】:2014-01-17 15:23:24
【问题描述】:

我正在我的 awk 脚本中尝试此语句(在包含单独代码的文件中,因此不是内联),脚本名称:print-table.awk

BEGIN {FS = "\t";OFS = "," ; print "about to open the file"}
{print $0}
END {print "about to close stream" }

并从 shell 以这种方式运行它

awk -f print-table.awk table

其中 table 是一个制表符分隔的文件, 我的目标是在外部函数中声明字段分隔符 (FS) 和输出字段分隔符 (OFS),并从 shell 简单地调用

awk -f file input

不使用 -F"\t" 在命令行中设置字段分隔符 并且没有标准输出到一个 sed 语句用逗号替换选项卡,

有什么建议吗?

【问题讨论】:

  • 您只是想用逗号替换制表符吗? tr \\t , < input

标签: shell awk


【解决方案1】:

您需要让 awk 相信发生了一些变化,以便使用您的 OFS 重新格式化 $0。尽管可能有一种更惯用的方法,但以下方法可行。

BEGIN {FS = "\t";OFS = "," ; print "about to open the file"}
{$1=$1}1
END {print "about to close stream" }

【讨论】:

  • 你应该像 anubhava {$1=$1}1 那样做。如果第一个字段是 0,则此 $1=$1 失败。那么它就不是真的并且不会被打印出来。
  • 确实如此。我有 anubhava 最初写的东西,但为了简洁起见,我试图“打高尔夫球”。 NF=NF 避免了零问题,但仍然有空字符串版本,所以我猜它是更长的版本。
  • 您好 Etan,谢谢您的回复,但这是什么原因?为什么我要更改其中一个字段或“假”来更改其中一个字段?我认为 BEGIN 例程任务是启动属性以应用于主例程,但我不明白为什么需要进行更改....
  • 因为 ask 不会根据 OFS 格式化 $0,除非它必须重建 $0 的内容。直到,除非,你说服 awk 它需要这样做,它使 $0 的内容保持不变,OFS 仅用于生成的输出。如果您阅读 awk 手册页的 Fields 部分的倒数第二段,您会看到对这个概念的引用。
  • @EtanReisner “仍然有空字符串版本”是什么意思?
【解决方案2】:

您需要更改 awk 中的字段之一:

awk 'BEGIN {FS="\t";OFS=","; print "about to open the file"} {$1=$1}1' file

【讨论】:

  • 嘿,Anubhava,{$1=$1} 后面的 1 是什么意思?另外,您说“您需要更改其中一个字段”,但据我所知,“我通常使用 bash”,$1=$1,不会更改 $1,它会重新分配相同的值。
  • 是的,我的意思只是重新分配。 $1=$1 不会更改字段值,但会强制使用提供的 OFS 作为逗号重新格式化输入记录。最后 1 也可以是任何其他非零值,它基本上告诉 awk 打印输入记录。
  • @anubhava 在哪种情况下需要1?例如,没有它也会打印空字段:echo ",0,eh" | awk 'BEGIN {FS=",";OFS="--"} {$1=$1} {print $0}'
  • awk可以改写为:awk 'BEGIN {FS=",";OFS="--"} {$1=$1} 1
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多