IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

awk 入出力の区切り文字の指定

どうも、nippaです。

テキスト処理で手っ取り早く処理するために、awkを使ってみたいと思います。

環境

OS: MacOSX 10.14 (Mojava)
awk version 20070501

1. サンプルデータ

sample.csvとファイルに、以下を書き込んでください。

2020/1/1 1:00:00, 11, 21
2020/1/2 2:00:00, 12, 22
2020/1/3 3:00:00, 13, 23
2020/1/4 4:00:00, 14, 24
2020/1/5 5:00:00, 15, 25

2. データの出力

  • 入力値をすべて出力
awk '{print $0}' sample.csv

#結果
2020/1/1 1:00:00, 11, 21
2020/1/2 2:00:00, 12, 22
2020/1/3 3:00:00, 13, 23
2020/1/4 4:00:00, 14, 24
2020/1/5 5:00:00, 15, 25
  • 列を指定して出力
    デフォルトの入力ファイルの区切り文字は半角スペースになっています。
# 1列目の出力
awk '{print $1}' sample.csv

2020/1/1
2020/1/2
2020/1/3
2020/1/4
2020/1/5

# 2、3列目の出力
awk '{print $2, $3}' sample.csv

1:00:00, 11,
2:00:00, 12,
3:00:00, 13,
4:00:00, 14,
5:00:00, 15,

,で出力列を分けると、区切り文字ありで出力されます。 デフォルトの出力の区切り文字は半角スペースです。

  • 最終列を指定して出力
awk '{print $NF}' sample.csv

1:00:00, 11,
2:00:00, 12,
3:00:00, 13,
4:00:00, 14,
5:00:00, 15,
  • 最終列から3つ手前の列(最初の列)を出力
awk '{print $(NF-3)}' sample.csv

2020/1/1
2020/1/2
2020/1/3
2020/1/4
2020/1/5

3. 入力データの区切りの指定

区切り文字は-F"[区切り文字]"で指定できます。

# 区切り文字(カンマ)
awk -F"," '{print $1}' sample.csv

2020/1/1 1:00:00
2020/1/2 2:00:00
2020/1/3 3:00:00
2020/1/4 4:00:00
2020/1/5 5:00:00

# 区切り文字(コロン)
awk -F":" '{print $1}' sample.csv

2020/1/1 1
2020/1/2 2
2020/1/3 3
2020/1/4 4
2020/1/5 5

# 区切り文字(スラッシュ)
awk -F"/" '{print $1}' sample.csv

2020
2020
2020
2020
2020

awk内部のコマンドとして、区切り文字を指定することもできます。

# 区切り文字(カンマ)
awk '{FS=","}{print $1}' sample.csv

2020/1/1 1:00:00
2020/1/2 2:00:00
2020/1/3 3:00:00
2020/1/4 4:00:00
2020/1/5 5:00:00

4. 出力データの区切りの指定

OFS(output field separator)変数に値を与えて指定します。デフォルト値はBlankになります。

# 区切り文字(aaa)
awk 'BEGIN{OFS="aaa"}{print $1, $2}' sample.csv

2020/1/1aaa1:00:00,
2020/1/2aaa2:00:00,
2020/1/3aaa3:00:00,
2020/1/4aaa4:00:00,
2020/1/5aaa5:00:00,

区切り文字を複数指定することもできます。

# 区切り文字(コロンまたはスラッシュ)
awk -F'[:/]' '{print $3,$4}' sample.csv
1 1 00
2 2 00
3 3 00
4 4 00
5 5 00

5. 入出力データの区切りの指定

OFS(output field separator)変数に値を与えて指定します。デフォルト値はBlankになります。

# 入力の区切り文字(スラッシュ)
# 出力の区切り文字(ドット)
awk 'BEGIN {FS="/";OFS="."}{print $1, $2, $3}' sample.csv
#または、
awk -F"/" -v OFS="." '{print $1, $2, $3}' sample.csv

2020.1.1 1:00:00, 11, 21
2020.1.2 2:00:00, 12, 22
2020.1.3 3:00:00, 13, 23
2020.1.4 4:00:00, 14, 24
2020.1.5 5:00:00, 15, 25

感想

ちょっとしたテキストファイルの処理にawkは非常に便利です。

今回はawkの入出力の区切りを取り上げましたが、今後もう少し処理を勉強していきたいと思います。

ではでは、また次回。