【问题标题】:Simple awk command issue (FS, OFS related)简单的 awk 命令问题(FS、OFS 相关)
【发布时间】:2013-04-18 16:10:21
【问题描述】:

我尝试重新组织包含以下内容的文件的格式:

>Humanl|chr16:86430087-86430726 | element 1 | positive
>Humanl|chr16:85620095-85621736 | element 2 | negative
>Humanl|chr16:80423343-80424652 | element 3 | negative
>Humanl|chr16:80372593-80373755 | element 4 | positive
>Humanl|chr16:79969907-79971297 | element 5 | negative
>Humanl|chr16:79949950-79951518 | element 6 | negative
>Humanl|chr16:79026563-79028162 | element 7 | negative
>Humanl|chr16:78933253-78934686 | element 9 | negative
>Humanl|chr16:78832182-78833595 | element 10 | negative

我的命令是:

awk '{FS="|";OFS="\t"} {print $1,$2,$3,$4,$5}'

这是输出:

>Human|chr16:86430087-86430726  |      element 1      |
>Human  chr16:85620095-85621736         element 2      negative
>Human  chr16:80423343-80424652         element 3      negative
>Human  chr16:80372593-80373755         element 4      positive
>Human  chr16:79969907-79971297         element 5      negative
>Human  chr16:79949950-79951518         element 6      negative
>Human  chr16:79026563-79028162         element 7      negative
>Human  chr16:78933253-78934686         element 9      negative
>Human  chr16:78832182-78833595         element 10     negative

除第一行外,每一行都可以正常工作。我不明白为什么会这样。

有人可以帮我吗?谢谢!

【问题讨论】:

  • 您已经有了答案,但请考虑将来的问题,包括示例输入、当前和预期的文本输出。
  • 好的,以后会做帽子的。

标签: linux awk


【解决方案1】:

简答

FSOFS 设置得太晚而无法影响第一行,请改用以下内容:

awk '{print $1,$2,$3,$4,$5}' FS='|' OFS='\t'

您也可以使用这个较短的版本:

awk -v FS='|' -v OFS='\t' '$1=$1'

稍长一点的回答

它不起作用,因为在设置FSOFS 时,awk 已经执行了记录/字段拆分。您可以通过将$0 设置为$0 来强制重新拆分,例如:

awk '{FS="|";OFS="\t";$0=$0} {print $1,$2,$3,$4,$5}'

执行此操作的常规方法是 1. 在 BEGIN 子句中设置 FS 和其他,2. 通过 -v VAR=VALUE 表示法设置它们,或 3. 在脚本之后将它们附加为 VAR=VALUE。我最喜欢的风格是最后一种选择:

awk '{print $1,$2,$3,$4,$5}' FS='|' OFS='\t'

请注意,设置-v 和脚本后变量之间存在显着差异。 -v 将在 BEGIN 子句之前设置变量,而在 BEGIN 子句之后设置变量的脚本后设置。

【讨论】:

  • 感谢您的解释!
  • 您的答案最后一段中的“脚本后变量”是什么?这个术语之前没有解释过。您是指您在脚本之后指定的VAR=VALUE 组合吗?
  • @jena: 是的,我就是这个意思
【解决方案2】:

尝试:

awk 'BEGIN{FS="|";OFS="\t"} {print $1,$2,$3,$4,$5}'

【讨论】:

  • 我自己正在寻找其他答案(特别是 -v OFS='\t' 的格式),但我认为这是解决 OP 遇到的问题的更好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多