首页 > 解决方案 > 对于制表符分隔文件,用 0 填充空列单元格

问题描述

我有一个像这样的制表符分隔文件,但是对于某些行,列号小于应有的值(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' 但是所有像这样的解决方案都需要在那里存在列空间,我该如何修复我的表?

标签: bashshellawksed

解决方案


$ 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

更改c64您的真实输入。


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

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

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


使用perl(请参阅将零添加到列表以获取解释):

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

推荐阅读