【问题标题】:awk: remove multiple tabs between each fields and output a line where each field is separated by a single tabawk:删除每个字段之间的多个选项卡并输出一行,其中每个字段由单个选项卡分隔
【发布时间】:2020-02-23 14:59:36
【问题描述】:

我有一个文件,其第 11 行理论上应该有 1011 列,但它的每个字段之间似乎有超过 1 个选项卡。进一步来说, 如果我使用

awk '{print NF}' file

然后我可以看到第 11 行的字段数与其他所有行相同(前十行除外,它们的格式不同。这是意料之中的)。 但是如果我使用

awk 'BEGIN{FS="\t"} {print NF}' file

我可以看到第 11 行有 2001 个字段。基于此,我怀疑它的某些字段被多个空格分隔。 我想让每个字段只用 1 个选项卡分隔,所以我尝试了

awk 'BEGIN{OFS="\t"} {print}' file > file.modified

但是,这并不能解决问题

awk 'BEGIN{FS="\t"} {print NF}' file.modified 

仍然表示第 11 行有 2001 个字段。 谁能指出实现我目标的方法?非常感谢!我已将文件的前 100 行放在以下 google drive 链接中。 https://drive.google.com/file/d/1qOjzjUnJKJpc4VpDxwKPBcqMS7MUuyKy/view?usp=sharing

【问题讨论】:

    标签: bash unix awk


    【解决方案1】:

    要将多个标签压缩到一个标签,您可以使用tr

    tr -s '\t' <file >file.modified
    

    【讨论】:

      【解决方案2】:

      这可能对 GNU awk 有所帮助:

      awk 'BEGIN{FS="\t+"; OFS="\t"} {$1=$1; print}' file
      

      见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

      【讨论】:

      • 这行得通!谢谢。顺便说一句,你能解释一下这里什么时候需要 $1=$1 吗?
      • $1=$1 强制 awk 使用新的输出字段分隔符 (OFS) 重建当前行。
      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多