CSVファイルの部分文字列を特定の長さに切り捨てます。

CSVファイルの部分文字列を特定の長さに切り捨てます。

以下のファイルがあります。Test.csv

"pav",12345,"ABCD,EF;xyz23;15rtg",,
"xyz",,"C4DEF;x23yu;rtg",,

修正後:

cat Test.csv

"pav",12345,"AB;xy;15",,
"xyz",,"C4;x2;rt",,

これサム""で区切られた部分文字列を含むrdフィールドは、その部分;文字列で置き換える必要があります。

ベストアンサー1

以下が使用されますcsvkit参照フィールドにカンマを含むCSVデータを直接解析すると、awkエラーが発生しやすいためです。

これにより、正しい形式の3番目の列が生成されます。

csvcut -c 3 file.csv |
sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' >tmp-3rd

与えられた入力に対して、これは以下を生成します。

"AB;xy;15"
"C4;x2;rt"
  • csvcut3番目の列が切り捨てられます。
  • sedすべての二重引用符が行の最初または最後に表示されると、データから削除されます。
  • プログラムは、区切りフィールドをawk繰り返してフィールド;ごとに2文字の長さに短縮します。二重引用符でデータを印刷します。
  • 出力はファイルに書き込まれますtmp-3rd

次に、元のデータに再組み立てします(これは、手続き型置換をbash実行するために使用できる別のシェルであると仮定します<(...))。

paste -d, <( csvcut -c 1,2 file.csv ) tmp-3rd <( csvcut -c 4,5 file.csv ) | csvformat
  • paste列はカンマで区切られ、一緒にグループ化されます。
  • 最初のプロセスは元のファイルの最初の2つの列を置き換え、2番目のプロセスは最後の2つの列を置き換えます。中央には、修正された3番目の列があります。
  • csvformatオプションのステップとして、必要に応じてフィールドを参照または逆参照してデータを渡します。

出力は次のとおりです

pav,12345,AB;xy;15,,
xyz,,C4;x2;rt,,

一時ファイルの必要性をバイパスします。

paste -d, \
    <( csvcut -c 1,2 file.csv ) \
    <( csvcut -c 3 file.csv | sed -r 's/^"|"$//g' |
       awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' ) \
    <( csvcut -c 4,5 file.csv ) | csvformat

おすすめ記事