LoginSignup
14
10

More than 5 years have passed since last update.

awkでcsvに任意の列を追加する

Last updated at Posted at 2016-07-03

あああ,いいい,ううう,えええ,かかか,ききき

「えええ」と「かかか」の間に「おおお」を追加したい。
=awkで$4の後に「,おおお」を追加すればOK

コード

echo "あああ,いいい,ううう,えええ,かかか,ききき" |
awk -F, 'BEGIN{OFS=","}{$4=$4",おおお";print}'

結果

$ echo "あああ,いいい,ううう,えええ,かかか,ききき" | awk -F, 'BEGIN{OFS=","}{$4=$4",おおお";print}'

あああ,いいい,ううう,えええ,おおお,かかか,ききき

2018年8月更新:↑こんな方法を使ってはいけない

たまにアクセスがあるようなので更新します…
上記のように投稿していたのですが、CSVをawkで更新するのは筋が悪いのでやめましょう。

確かにawkで「-F,」または「FS=","」を指定すると、カンマ区切りのテキストを扱えるようになります。
しかし、単純にカンマで区切るとまずい場合(例えば、ダブルクオーテーションの中にカンマが存在する場合や、改行が含まれる場合)が結構あります。

そういう「まずい場合」が含まれないことが保証されていればよいですが、
現代でcsvを扱う人間はそんな保証が受けられないことが大半です。

UNIXでCSVを扱うコマンドはないの?

「csvを手軽にUNIXコマンドで操作したい」と思ってこの記事にたどり着いたのかと思いますが、
csvを仕様通りに正確にパースしてくれる(csvの構造を適切に認識してくれる)コマンドは
あまり多く存在しませんし、「これ」といった決定版はありません。

csvを操作するための「csvawk」というコマンドがあればいいのですが、ありません。
※あるにはあるのですが、pythonやPerlで実装されており、速度面で現実的ではありません。
現代のCSVは数GBあることが普通なので…扱うデータが軽いなら使ってみてください。

UNIXでCSVを扱うコマンドはないの?→ある

私の強いおすすめは、NYSOL(MCMD)( https://github.com/nysol/mcmd/wiki )です。
このコマンド、全く有名じゃなくて寂しいのですが、
csvを完璧に扱うことができ、しかもとても高速に動作します。GB単位のcsvでも余裕です。
列の抜き出しや集計、ソート、列同士の計算、列の追加など、基本的なことを高速に行えます。
SASやSPSSを回したり、BigQueryのようなデータベースに突っ込んだりする必要がなくなります。

カラムの指定方法が「f=column1,column2」など、「f=」を付ける必要があったり、
その他パラメーターの指定方法がUNIXの標準的な仕様と合ってないのは悲しいのですが、
ビジネスでも使える有用なコマンドです。ぜひ使ってみてください。
(回し者ではありません)

14
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10