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

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

空のセルを含む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で動作します。ホームブルーパッケージマネージャ

答え2

あなたのsedコマンドは良く見え、あなたの入力例を試してみるとうまくいきます。

それでも、パイプで区切られたファイルまたは一般的なテーブル形式の値を解析するための一般的な代替手段としてawk。 "空"列を00000000000。これには、次のものを使用できます。

awk 'BEGIN{FS=OFS="|"} {for (i=1;i<=NF;i++) {if ($i=="") $i="00000000000"}} 1' filename
  • これは、最初に入力と出力awkに対してどのフィールド区切り文字が考慮されるかを示します(例は入力フィールド区切り文字、例は出力フィールド区切り文字です)。|FSOFS
  • 次に、行のすべてのフィールド(=列)を繰り返して空のフィールドを見つけたら、その値を00000000000(「現在の行のフィールド番号」$iを参照し、次を含む自動生成変数)に設定します。フィールド数)。iNF
  • 1最後に、可能な修正(最後に汚れているように見える部分)を含むすべての行を印刷します。

フィールド番号にのみ適用されるように簡単に制限することもできます。 2. 別の空の列を異なる方法で処理するには、次のようにします。

awk 'BEGIN{FS=OFS="|"} {if ($2=="") $2="00000000000"} 1' filename

関連情報