【问题标题】:How to parse only one column with a different delimiter?如何仅解析具有不同分隔符的一列?
【发布时间】:2014-05-07 07:00:26
【问题描述】:

我有一个制表符分隔的文件。最后一列是用分号分隔的不等长的行。我想解析这个专栏。

输入:

AA   762    8640    BB    CC     DD      EE=T;FF=C;GG=G;HHA
II   852    6547    JJ    KK     LL      MM=G;NN=P;QQ=RF

期望的输出:

AA   762    8640    BB    CC     DD      EE=T    FF=C    GG=G   HHA
II   852    6547    JJ    KK     LL      MM=G    NN=P    QQ=RF

我可以得到例如使用此代码的前三个值:

awk 'BEGIN { FS=";" } { print $1, $2, $3}' file

但是,当我运行它时,它不会解析列,而是按原样打印文件:

awk 'BEGIN { FS=";" } { print $0}' file

我该如何解决这个问题?

【问题讨论】:

    标签: awk


    【解决方案1】:

    另一种 方法

    awk -F'[[:space:];]' -vOFS='\t' '{$1=$1;print}' input.txt
    AA  762 8640    BB  CC  DD  EE=T    FF=C    GG=G    HHA
    II  852 6547    JJ  KK  LL  MM=G    NN=P    QQ=RF
    

    【讨论】:

    • 我们可以放弃print 而只使用awk ... '{$1=$1}1' input.txt,但比隐晦更清楚。 :)
    • @jaypal,明确的print 可能是我的 Python 根源出卖了我 :-) 是的,我喜欢它可读
    • @1_CR,谢谢!你能解释一下[:space:] 指定的内容吗?另外,OFS 和 vOFS 有什么区别?
    • @user2162153, -F'[[:space:];]' 将字段分隔符设置为空格或;(空格是制表符或空格字符)。 -vOFS='\t' 实际上是 -v OFS='\t'。这允许通过命令行传入OFS,而不是在脚本中设置它
    • @1_CR,谢谢! awk如何理解space这个词表示空格分隔符?
    【解决方案2】:

    你可以试试这样的:

    awk 'BEGIN{FS=OFS="\t"}{gsub(/;/,"\t",$NF)}1' file
    

    $ cat file
    AA  762 8640    BB  CC  DD  EE=T;FF=C;GG=G;HHA
    II  852 6547    JJ  KK  LL  MM=G;NN=P;QQ=RF
    

    $ awk 'BEGIN{FS=OFS="\t"}{gsub(/;/,"\t",$NF)}1' file
    AA  762 8640    BB  CC  DD  EE=T    FF=C    GG=G    HHA
    II  852 6547    JJ  KK  LL  MM=G    NN=P    QQ=RF
    

    【讨论】:

      【解决方案3】:

      使用tr 将分号替换为如下标签:

      tr ";" "\t" <yourfile 
      

      【讨论】:

      • +1。还有tr ";" "\t" 1&lt;&gt;yourfile &lt;yourfile 就地更换!
      • @1_CR 这很漂亮,我认为你喜欢它的可读性! :P!!
      • @jaypal,如果你了解底层mechanics,它实际上非常优雅
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多