私はLinux上でほぼ2億行のタブで区切られたファイルを扱っています。バイナリ値を含む1つの列では、データ型が一貫しておらず、欠落している値がたくさんあることがわかりました。例は次のとおりです。
入力する:
timestamp val
1589205592 0
1589205593 0.0
1589205594
1589205595 1
1589205595 1.0
推薦されたものを書いた。ここ私はawkを使用していますが、ファイルの容量がかなり大きく、非常に遅いようです。値をゼロで埋め、データ型を一貫して作成しようとしています。つまり、すべての浮動小数点を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
その後、データを読み取り、新しいファイルに書き込みます。ここで、2番目の列のすべての数値は整数に変換されます(下降すると、欠落データは0になります)。
たとえば、小数点以下の2桁の浮動小数点出力が必要な場合は、呼び出しでフォーマット文字列として代わりに%.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 を使用して新しいファイルの名前を変更します。