空のセルを含む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で動作します。ホームブルーパッケージマネージャ。
答え2
あなたのsed
コマンドは良く見え、あなたの入力例を試してみるとうまくいきます。
それでも、パイプで区切られたファイルまたは一般的なテーブル形式の値を解析するための一般的な代替手段としてawk
。 "空"列を00000000000
。これには、次のものを使用できます。
awk 'BEGIN{FS=OFS="|"} {for (i=1;i<=NF;i++) {if ($i=="") $i="00000000000"}} 1' filename
- これは、最初に入力と出力
awk
に対してどのフィールド区切り文字が考慮されるかを示します(例は入力フィールド区切り文字、例は出力フィールド区切り文字です)。|
FS
OFS
- 次に、行のすべてのフィールド(=列)を繰り返して空のフィールドを見つけたら、その値を
00000000000
(「現在の行のフィールド番号」$i
を参照し、次を含む自動生成変数)に設定します。フィールド数)。i
NF
1
最後に、可能な修正(最後に汚れているように見える部分)を含むすべての行を印刷します。
フィールド番号にのみ適用されるように簡単に制限することもできます。 2. 別の空の列を異なる方法で処理するには、次のようにします。
awk 'BEGIN{FS=OFS="|"} {if ($2=="") $2="00000000000"} 1' filename