填充空单元格并使数据类型在制表符分隔的文件中相同

填充空单元格并使数据类型在制表符分隔的文件中相同

我正在 Linux 上处理一个制表符分隔的文件,行数接近 200MM。在包含二进制值的一列中,我注意到数据类型不一致并且存在大量缺失值。这是一个例子:

输入:

timestamp    val
1589205592   0  
1589205593   0.0
1589205594  
1589205595   1
1589205595   1.0

我尝试了建议的内容这里使用 awk,但由于文件很大,因此似乎非常慢。我试图用 0 填充这些值,使数据类型一致,即,将所有 float 转换为 int,并覆盖当前文件。

输出:

timestamp    val
1589205592   0  
1589205593   0
1589205594   0
1589205595   1
1589205595   1

答案1

awk 'BEGIN { FS=OFS="\t" } NR > 1 { $2 = sprintf("%d", $2) }; 1' file >file.new

这将读取您的数据并将其写入一个新文件,其中第二列中的所有数字都转换为整数(通过向下舍入,丢失的数据将变成零)。

如果您想要浮点输出,例如具有两位小数,请使用%.2f代替%d作为调用中的格式字符串sprintf()

输出将以制表符分隔。

一旦您亲眼检查了新文件,只需用mv它代替旧文件即可。

答案2

你可以尝试磨坊主

mlr --csvlite --fs tab put '$val = is_empty($val) ? 0 : int($val)' file

米勒提供了一个就地模式如果你想尝试一下的话。

答案3

或内联sed(只需添加-i尽管它也有临时文件开销)

sed -e "s/\.0$//" -e "s/\t$/\t0/" file

答案4

只需执行以下操作:

gawk -i inplace -F'\t' 'NR>1{ $2*=1 }1' OFS='\t' infile

然而,-i inplace它并没有发挥这样的魔力,而是创建一个临时文件,然后在进程结束后替换它。所以你也可以这样做

awk -F'\t' 'NR>1{ $2*=1 }1' OFS='\t' infile > newfile

然后删除原始 infile 或使用原始 infile 重命名新文件。

相关内容