空のセルを埋め、タブで区切られたファイルのデータ型を同じにします。

空のセルを埋め、タブで区切られたファイルのデータ型を同じにします。

私は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使用します。%dsprintf()

出力はタブで区切られます。

新しいファイルを直接目で確認したら、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 を使用して新しいファイルの名前を変更します。

関連情報