単一のヘッダーと多数のレコードを含むフラットファイル(txt / csv)があります。 awk / sed / unixツールを使用して、レコードのフィールド3と5からのみ先行ゼロ(1つ以上の先行ゼロかもしれません)を削除したいと思います。いくつかの解決策を見てきましたが、ほとんどは二重引用符の値を考慮していないようです。例:
"ACCOUNT","REAL","022000046977525","REAL","00000220000488","ONLINE",......
awk、sed、printf、正規表現などを試してみました。すでに投稿された内容を私が逃したのでしょうか?アイデア?ありがとうございます。
希望の出力:
"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE",......
答え1
使用awk
:
awk -F, '{OFS=","; sub(/"0+/, "\"", $3); sub(/"0+/, "\"", $5)}1'
ヘッダーに実際に前にゼロがない限り問題はありませんが、必要に応じて次のことができます。
awk -F, 'NR > 1{OFS=","; sub(/^"0+/, "\"", $3); sub(/^"0+/, "\"", $5)}1'
これにより、"
フィールド3と5のすべての先行ゼロが引用符でのみ置き換えられます。
答え2
使用ミラー、ヘッダーを含むCSVファイルを提供する
$ cat file.csv
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","022000046977525","REAL","00000220000488","ONLINE",......
(ヘッダの前にあるゼロが影響を受けないことを証明するために愚かなフィールド名を選択しました。)
$ mlr --csv --ofmt '%.0f' --quote-all put '$000003=$000003; $000005=$000005' file.csv
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE","......"
またはcsvformat
(python csvkitで)とnumfmt
(GNU Coreutilsで)以下を使用してください。
$ csvformat file.csv | numfmt -d, --header --field 3,5 --format '%.0f' | csvformat -U2
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE","......"
答え3
GNU sedの使用:
$ sed -re '
s/","/\n/4;s//\n/2
s/\n0*([0-9])/","\1/g
' file.csv
すべてのフィールドが参照されると仮定します。
3 番目と 5 番目のフィールドを改行で表示し、先行ゼロをすべて削除します。すべてゼロの場合、フィールドは消えるのではなく、最後にそのまま残ります。