【问题标题】:fill empty column cells with 0 for tab delimited file [duplicate]对于制表符分隔的文件,用 0 填充空列单元格 [重复]
【发布时间】:2020-10-13 19:15:38
【问题描述】:

我有一个像这样的制表符分隔文件,但是对于某些行,列号小于应有的值(64 列),例如,如何用 0 填充这些单元格(文件有 64 列和4750 行会太大):

a b c d e
1 2 3 4 5
1
0 2
3

(第 2,3,4 列有 1,2,1 列对应且没有尾随 \ts)

我想做

a b c d e
1 2 3 4 5
1 0 0 0 0
0 2 0 0 0
3 0 0 0 0

我已经尝试过 sed 's/\t\t/\t0\t/g' 但是像这样的所有解决方案都需要存在列空间,我该如何修复我的表?

【问题讨论】:

标签: bash shell awk sed


【解决方案1】:
$ awk -v c=5 'BEGIN{FS=OFS="\t"} {for(i=NF+1; i<=c; i++) $i=0} 1' ip.txt
a   b   c   d   e
1   2   3   4   5
1   0   0   0   0
0   2   0   0   0
3   0   0   0   0

c 更改为64 以供您实际输入。


sed 不适合这个,但是为了好玩,如果你没有空行,你可以这样做:

sed -E ':a s/^([^\t]+)((\t[^\t]+){0,3})$/\1\2\t0/; ta'

这里的s 命令只有在少于5 字段时才会匹配(将{0,3} 更改为{0,62} 用于64 列大小写),然后再添加一个字段。只要替换成功,ta 就会分支到标签a,从而模拟一个循环。


使用perl(请参阅Append zeros to list 了解说明):

perl -pe 's|$|"\t0" x (4 - tr/\t//)|e'
perl -F'\t' -lane 'print join "\t", @F, (0)x(4-$#F)'

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed ':a;s/[^\t]\+/&/64;t;s/$/\t0/;ta' file
    

    检查是否有正确的列数(对于你 64),如果是,请退出。

    否则,附加一个制表符和一个零并重复。

    注意这假设文件是​​制表符分隔的,对于更通用的解决方案,请使用:

    d=' '
    r=$(<<<"$d" sed 's/.*/[^&]\\+/')
    sed ':a;s/'"$r"'/&/64;t;s/$/'"$d"'0/;ta' file
    

    $d 是分隔符,$r 是双正则表达式。

    分隔符是/\ 的解决方案留给读者。

    【讨论】:

      【解决方案3】:

      添加一个更通用的变体,您能否尝试使用 GNU awk 编写和测试并显示示例。通过这一点,我们不需要提及任何数量的字段,它会找到最大数量的字段并根据它添加零。

      awk '
      FNR==NR{
        maxField=(maxField>NF?maxField:NF)
        next
      }
      {
        if(NF<maxField){
          val=sprintf("%0"maxField-NF"d","0")
          gsub(/0/,"& ",val)
        }
        print $0,val
        val=""
      }
      ' Input_file Input_file | column -t
      

      【讨论】:

        猜你喜欢
        • 2011-06-07
        • 2020-12-01
        • 2017-08-11
        • 1970-01-01
        • 2021-03-03
        • 2017-06-07
        • 2020-02-09
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多