我正在 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
答案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 重命名新文件。