カンマ()で区切られた入力ファイルがあります,
。一部のフィールドはカンマで二重引用符で囲まれています。サンプルラインです
123,"ABC, DEV 23",345,534.202,NAME
二重引用符だけでなく、二重引用符内のすべてのカンマを削除する必要があります。したがって、上記の行は次のように解析する必要があります。
123,ABC DEV 23,345,534.202,NAME
次の使用法を試しましたが、sed
期待した結果が得られませんでした。
sed -e 's/\(".*\),\(".*\)/\1 \2/g'
sed
それとも、awk
他のUNIXユーティリティに関するクイックヒントはありますか?
ベストアンサー1
awk
引用文のバランスが取れたら、次のように表すことができる引用符の間のカンマを削除する必要があります。
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' infile
出力:
123,ABC DEV 23,345,534.202,NAME
説明する
二重引用符でフィールド分割を実行するようにawkに指示します-F"
。これは、他のすべてのフィールドが引用符で囲まれたテキストであることを意味します。 forループはgsub
他のすべてのフィールドで動作します。グローバル置換の省略形として、","
カンマ()を空(""
)に置き換えます。最後に、1
基本コードブロックを呼び出します{ print $0 }
。