カテゴリー
【Awkでデータ解析のすゝめ】awkのみで2つのファイルを効率的に結合させる方法
※ 当ページには【広告/PR】を含む場合があります。
2021/02/10
2022/09/30
Awkでのファイルの結合
2つのファイル間でのデータ結合
$ cat << EOF > open.csv
2020-05-14,1596
2020-05-15,1529
2020-05-18,1565
2020-05-19,1575
2020-05-20,1570
2020-05-21,1599
2020-05-22,1551
2020-05-25,1553
2020-05-26,1583
2020-05-27,1569
2020-05-28,1537
2020-05-29,1571
2020-06-01,1558
2020-06-02,1564
2020-06-03,1599
2020-06-04,1590
2020-06-05,1571
EOF
$ cat << EOF > volume.csv
2020-05-19,9500
2020-05-20,9600
2020-05-21,8300
2020-05-22,3100
2020-05-25,3800
2020-05-26,9700
2020-05-27,14300
2020-05-28,18400
2020-05-29,12200
2020-06-01,4600
2020-06-02,11200
2020-06-03,12300
2020-06-04,8000
2020-06-05,8300
2020-06-08,15200
2020-06-09,19900
2020-06-10,8100
2020-06-11,16600
EOF
$ awk -F "," '
BEGIN {
OFS=","
}
F == 0 {
open_arr[$1] = $2;
next;
}
{
if($1 in open_arr) {
print $1, open_arr[$1], $2;
}
}
' F=0 open.csv F=1 volume.csv
#👇実行結果
2020-05-19,1575,9500
2020-05-20,1570,9600
2020-05-21,1599,8300
2020-05-22,1551,3100
2020-05-25,1553,3800
2020-05-26,1583,9700
2020-05-27,1569,14300
2020-05-28,1537,18400
2020-05-29,1571,12200
2020-06-01,1558,4600
2020-06-02,1564,11200
2020-06-03,1599,12300
2020-06-04,1590,8000
2020-06-05,1571,8300
... F=0 open.csv F=1 volume.csv
F
F
FILE
FL
F == 0 {...}
F=0
open.csv
F == 0 {...}
open_arr
open.csv
next
F == 0 {...}
open.csv
複数のファイルの結合を同時に行う
close.csv
$ cat << EOF > close.csv
2020-05-15,1565
2020-05-18,1540
2020-05-19,1567
2020-05-20,1598
2020-05-21,1551
2020-05-22,1541
2020-05-25,1578
2020-05-26,1569
2020-05-27,1569
2020-05-28,1570
2020-05-29,1558
2020-06-01,1554
2020-06-02,1588
2020-06-03,1569
2020-06-04,1565
2020-06-05,1566
2020-06-08,1563
2020-06-09,1536
2020-06-10,1549
2020-06-11,1516
2020-06-12,1482
2020-06-15,1479
2020-06-16,1539
2020-06-17,1539
2020-06-18,1550
EOF
$ awk -F "," '
BEGIN {
OFS=","
}
F == 0 {
open_arr[$1] = $2;
next;
}
F == 1 {
if($1 in open_arr) {
close_arr[$1] = $2;
}
next;
}
{
if($1 in open_arr) {
print $1, open_arr[$1], close_arr[$1], $2;
}
}
' F=0 open.csv F=1 close.csv F=2 volume.csv
#👇実行結果
2020-05-19,1575,1567,9500
2020-05-20,1570,1598,9600
2020-05-21,1599,1551,8300
2020-05-22,1551,1541,3100
2020-05-25,1553,1578,3800
2020-05-26,1583,1569,9700
2020-05-27,1569,1569,14300
2020-05-28,1537,1570,18400
2020-05-29,1571,1558,12200
2020-06-01,1558,1554,4600
2020-06-02,1564,1588,11200
2020-06-03,1599,1569,12300
2020-06-04,1590,1565,8000
2020-06-05,1571,1566,8300
おまけ〜データ解析しないならjoinコマンドの方が手っ取り早い
$ join -t"," -1 1 open.csv -2 1 volume.csv
2020-05-19,1575,9500
2020-05-20,1570,9600
2020-05-21,1599,8300
2020-05-22,1551,3100
2020-05-25,1553,3800
2020-05-26,1583,9700
2020-05-27,1569,14300
2020-05-28,1537,18400
2020-05-29,1571,12200
2020-06-01,1558,4600
2020-06-02,1564,11200
2020-06-03,1599,12300
2020-06-04,1590,8000
2020-06-05,1571,8300
Awkで複数の標準入力の結合
複数の標準入力をファイルの代わりに扱う
#👇データの生成
$ OPEN_DATA=$(
cat << EOF
2020-05-19,1575
2020-05-20,1570
2020-05-21,1599
2020-05-22,1551
EOF
)
#👇データを標準入力としてcatにリダイレクト
$ cat <(echo "$OPEN_DATA")
2020-05-19,1575
2020-05-20,1570
2020-05-21,1599
2020-05-22,1551
コマンド2 <(コマンド1)
<
<
(
コマンド1 | コマンド2
コマンド2 <(コマンド1)
|
#👇別のデータを生成
$ VOL_DATA=$(
cat << EOF
2020-05-19,9500
2020-05-20,9600
2020-05-21,8300
2020-05-22,3100
EOF
)
#👇データを標準入力(マルチストリーム)としてcatにリダイレクト
$ cat <(echo "$OPEN_DATA") <(echo "$VOL_DATA")
2020-05-19,1575
2020-05-20,1570
2020-05-21,1599
2020-05-22,1551
2020-05-19,9500
2020-05-20,9600
2020-05-21,8300
2020-05-22,3100
<(コマンド1) <(コマンド2) <(コマンド3) ...
標準入力のマルチストリームをAwkで処理する
F
#👇データを標準入力(マルチストリーム)をAwkで合成
$ awk -F"," '
BEGIN {
OFS=","
}
F == 0 {
open_arr[$1] = $2;
next;
}
{
if($1 in open_arr) {
print $1, open_arr[$1], $2;
}
}
' F=0 <(echo "$OPEN_DATA") F=1 <(echo "$VOL_DATA")
#👇合成結果
2020-05-19,1575,9500
2020-05-20,1570,9600
2020-05-21,1599,8300
2020-05-22,1551,3100
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー