テキストとしてパイプで区切られた値ファイルの空白セルを埋める[閉じる]

テキストとしてパイプで区切られた値ファイルの空白セルを埋める[閉じる]

空のセルを含む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

期待される出力が切り捨てられたようです00346743139003467431最後の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区切り文字を - 文字に変更します。@csvjq|

出力を新しいファイル名にリダイレクトし、オプションで元のデータを新しいファイルに置き換えます。

csvkitどちらもjqmacOSで動作します。ホームブルーパッケージマネージャ

おすすめ記事