空のセルを含むPSVファイルがあります。空のセルを値で埋めたいです。00000000000
入力例
0000000001|00346743139|201901|07
0000000002||201901|00
希望の出力
0000000001|003467431|201901|07
0000000002|00000000000|201901|00
使ってみました。
sed -i "s/||/|00000000000|/g" filename
ベストアンサー1
あなたのsed
コマンドは重複しないすべての文字列を||
。|00000000000|
少なくとも提供されたデータに対して、これがどのように問題を解決できないかは明らかではありません。
% sed 's/||/|00000000000|/g' file.csv
0000000001|00346743139|201901|07
0000000002|00000000000|201901|00
期待される出力が切り捨てられたようです00346743139
(003467431
最後の2つの整数が削除されます)。これが意図的なものかどうかは不明です。
Unixで標準以外のオプションを使用して-i
実装できない場合は、sed
投稿を参照してください。sed -i(所定の位置で編集)を使用して移植性を達成するには?
たとえば、macOSでコマンドを実行すると、次のようになります。
$ sed -i "s/||/|00000000000|/g" filename
sed: 1: "filename": invalid command code f
-i
これはオプションが異なる方法で使用されるためです。-i ''
macOSでこのオプションを使用してください(そしてシステムman sed
でこのオプションについて読んでください)。
より強力なCSVパーサーのために、実際のCSVパーサーを使用することができます。
使用csvkitのツールCSV解析を行い、jq
実際の処理を行います。
% csvjson -I -H file.csv | jq -r '.[] | map(select(. == null) |= "00000000000") | @csv' | csvformat -D '|'
0000000001|00346743139|201901|07
0000000002|00000000000|201901|00
まず、.csvファイルを使用してCSVファイルをJSONに変換しますcsvjson
。ここで使用するオプションは、型推論をオフにし(数値が文字列として解釈されるように)、CSVデータにヘッダー行がないことをユーティリティに通知します。ツールはデータに使用される正しい区切り文字をcsvjson
自動的に検出しますが、それを区切り文字として使用するように明示的に指示することもできます。|
|
-d '|'
その後、コードはjq
すべてのNULL値を文字列に置き換え、処理された00000000000
データをCSV形式に戻します。
パイプで区切られた出力が必要なので、出力で使用されるcsvformat
区切り文字を - 文字に変更します。@csv
jq
|
出力を新しいファイル名にリダイレクトし、オプションで元のデータを新しいファイルに置き換えます。
csvkit
どちらもjq
macOSで動作します。ホームブルーパッケージマネージャ。