awkでcsvの各フィールド前後にあるスペースを削除(トリム)する

Twitterでそんな感じの処理について見かけたので、後々使うことがあるかもしれないので残しておく。
とりあえず、カンマの前後にあるスペースは問答無用で削除する場合は、以下のようにawkを実行する。

awk 'BEGIN{FS=" *, *";OFS=","}{$1=$1;print $0}' test.csv
blacknon@BS-PUB-UBUNTU-01:~/b$ cat test.csv
a1,a2,a3,a4
b1,b2,b3,b4
c1, c2 ,c3,c4
,d2,d3,
e1,    e2,e3,e4
f1,f2,  ,f4
,g2,g3,g4
h1,h2 ,h3,h4
i1,  ,i3,i4
j1, j2,j3,
k1,k2,k3,     k4
l1,l2,    l3,l4
m1,m2,m 3,m4
blacknon@BS-PUB-UBUNTU-01:~/b$ awk 'BEGIN{FS=" *, *";OFS=","}{$1=$1;print $0}' test.csv
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4
,d2,d3,
e1,e2,e3,e4
f1,f2,,f4
,g2,g3,g4
h1,h2,h3,h4
i1,,i3,i4
j1,j2,j3,
k1,k2,k3,k4
l1,l2,l3,l4
m1,m2,m 3,m4
Sponsored Links

ちなみに上のやり方だと、スペースのみのフィールドは中のデータが削除されてしまう。
スペースのみのフィールドはそのままにする場合は、以下のように実行するといいだろう。

awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++)if($i !~ "^ *$")gsub(/^ +/,"",$i)gsub(/ +$/,"",$i); print $0}' test.csv
blacknon@BS-PUB-UBUNTU-01:~/b$ cat -A test.csv
a1,a2,a3,a4$
b1,b2,b3,b4$
c1, c2 ,c3,c4$
,d2,d3, $
e1,    e2,e3,e4$
f1,f2,  ,f4$
,g2,g3,g4$
h1,h2 ,h3,h4$
i1,  ,i3,i4$
j1, j2,j3,  $
k1,k2,k3,     k4$
l1,l2,    l3,l4$
m1,m2,m 3,m4$
blacknon@BS-PUB-UBUNTU-01:~/b$ awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++)if($i !~ "^ *$")gsub(/^ +/,"",$i)gsub(/ +$/,"",$i); print $0}' test.csv
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4
,d2,d3,
e1,e2,e3,e4
f1,f2,  ,f4
,g2,g3,g4
h1,h2,h3,h4
i1,  ,i3,i4
j1,j2,j3,
k1,k2,k3,k4
l1,l2,l3,l4
m1,m2,m 3,m4
blacknon@BS-PUB-UBUNTU-01:~/b$ awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++)if($i !~ "^ *$")gsub(/^ +/,"",$i)gsub(/ +$/,"",$i); print $0}' test.csv | cat -A
a1,a2,a3,a4$
b1,b2,b3,b4$
c1,c2,c3,c4$
,d2,d3, $
e1,e2,e3,e4$
f1,f2,  ,f4$
,g2,g3,g4$
h1,h2,h3,h4$
i1,  ,i3,i4$
j1,j2,j3,  $
k1,k2,k3,k4$
l1,l2,l3,l4$
m1,m2,m 3,m4$

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*