この記事は約4分50秒で読むことができます。

ファイルをグルーピングして分割する話

まえがき

awk便利だよな

参考文献

クロス集計をBash(とawk)だけで実装した話  

grp.sh

コード表示

[root@centos vx]# cat grp.sh
#!/bin/bash
grp(){
  RN=$1
  GRP=$2
  while read line;do
     echo ${line} | sed -e s/GRP/${GRP}/ | bash;
  done < <(seq ${RN} | xargs -I@ bash -c 'echo echo $\(\(@%GRP\)\)') | sort >grp
}

grp $1 $2

6行を3等分

コード表示

[root@centos vx]# ./grp.sh 6 3
[root@centos vx]# cat grp
0
0
1
1
2
2

対象ファイルをgrpに従い分割

対象ファイルはvminfo。$1でグルーピング単位を指定できるらしい。便利!

コード表示

[root@centos vx]# paste -d ' ' grp vminfo | awk '{print>"split_"$1}'
[root@centos vx]# ll split*
-rw-r--r--. 1 root root 52  6月  2 15:21 split_0
-rw-r--r--. 1 root root 52  6月  2 15:21 split_1
-rw-r--r--. 1 root root 52  6月  2 15:21 split_2
[root@centos vx]# cat vminfo
node1 52:54:00:5d:4a:3f
node2 52:54:00:dc:5b:1b
node3 52:54:00:77:33:99
node4 52:54:00:61:72:67
node5 52:54:00:88:c2:54
node6 52:54:00:a8:bc:df
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@'
bash -c cat split_0 
0 node1 52:54:00:5d:4a:3f
0 node2 52:54:00:dc:5b:1b
bash -c cat split_1 
1 node3 52:54:00:77:33:99
1 node4 52:54:00:61:72:67
bash -c cat split_2 
2 node5 52:54:00:88:c2:54
2 node6 52:54:00:a8:bc:df
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@' | awk '{print $2" "$3>"split_"$1}'
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@'
bash -c cat split_0 
node1 52:54:00:5d:4a:3f
node2 52:54:00:dc:5b:1b
bash -c cat split_1 
node3 52:54:00:77:33:99
node4 52:54:00:61:72:67
bash -c cat split_2 
node5 52:54:00:88:c2:54
node6 52:54:00:a8:bc:df

Leave a Reply

Your email address will not be published. Required fields are marked *