【问题标题】:substitute consecutive tabs for "\tNA\t"用连续的制表符替换“\tNA\t”
【发布时间】:2023-03-19 00:08:01
【问题描述】:

有一个格式错误的 tsv 文件,其中到处都是空字段。我希望在 linux 上用“NA”填充这些空白。

我尝试了awk '{gsub("\t\t","\tNA\t"); print$0)',但这只会将一个空白空间替换为 NA 实例。链接命令 awk '{gsub("\t\t","\tNA\t"); print$0)|awk '{gsub("\t\t","\tNA\t"); print$0) 每行执行两次替换 - 但如果我有很多列要处理,则不是特别有用。

有没有更快(更整洁)的方法来做到这一点?

【问题讨论】:

    标签: linux awk gsub


    【解决方案1】:

    这有点复杂,因为您必须处理换行空字段、行尾空字段和可能连续的空字段。我无法使用 sed 实现某些目标,这可能很疯狂。但是使用 awk 这似乎可行:

    $ cat test.txt
    a       c   d   e
        g   h   i   j
    k   l   m   n   
    p           s   t
            w   x   
    
    $ awk -F$'\t' '{for(i=1;i<=NF;++i){if($i==""){printf "NA"}else{printf $i} if(i<NF)printf "\t"} printf "\n"}' test.txt 
    a   NA  c   d   e
    NA  g   h   i   j
    k   l   m   n   NA
    p   NA  NA  s   t
    NA  NA  w   x   NA
    

    当心复制粘贴,选项卡可能会转换为空格...顺便说一下,我搜索了 CSV 文件的解决方案,并从this thread 对其进行了修改;)您可以看到,最易读的选项是睡一觉。

    【讨论】:

      【解决方案2】:

      您尝试过使用 sed 吗?例如:

      cat test.txt
      test        test        test
      test        test        test
      
      sed 's:\t\t*:\tNA\t:g' test.txt
      
      test    NA  test    NA  test
      test    NA  test    NA  test
      

      【讨论】:

      • 我试过了,但是在连续标签的情况下,它只会替换第一个。
      • 你试过全局g参数吗?
      • 是的。 :( 我将您的行复制到命令行并检查了输出。
      • 您在下面的命令和我的命令给出相同的输出。可能是我遗漏了您的文件中的某些内容?
      • 我猜我的文件有多个连续制表符和以制表符开头的行的多个实例。前者只导致第一个 \t\t 替换 \tNA\t(我假设在 \t\t\t 的情况下,该行替换了前两个 \t 但不理会第三个,导致 \tNA\ t\t);后者需要awk '{ gsub(/\t\t/,"\tNA\t") - 当然我肯定有一个等效的 sed (对不起,我没有受过编程培训,所以我不熟悉这些术语)。
      【解决方案3】:

      好的,这可行: awk '{ gsub(/\t\t\t/,"\tNA\tNA\t"); print $0}' test.txt | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{gsub(/^[\t]+/,"NA\t"); print $0}'

      有趣的是,这不会: awk '{ gsub(/\t\t\t/,"\tNA\tNA\t"); print $0}' test.txt | awk '{ gsub(/\t\t/,"\tNA\t"); print $0}' | awk '{gsub(/^[\t]+/,"NA\t"); print $0}'

      我确信有一个更优雅的解决方案..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        • 2021-03-13
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多