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

awkの範囲指定演算子を理解したかった話(理解できなかった。)

範囲指定演算子のうごき

内部的にはパタンの真偽を判定している。3になるまでパタンは偽で、3行目以上5行目以下を出力。組込変数NRが5より大きくなったら、偽0にして5より大きい値を出力できないように制御している。とかおもってたけどね。。

コード表示

[root@61eff46d2318 html]# seq 1 10 | awk 'NR==3,NR==5'
3
4
5

sql的には。。。

これを別の切り口で理解したいがために19cr3いんすとした。

コード表示

[oracle@7347fe12d03f ~]$ sqlplus aine/ORACLE_PWD@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Wed May 1 22:12:09 2019
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Wed May 01 2019 21:56:10 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select level from dual connect by level <= 10;

     LEVEL
----------
	 1
	 2
	 3
	 4
	 5
	 6
	 7
	 8
	 9
	10

10 rows selected.

SQL> select level as rn,case when level between 3 and 5 then 1 else 0 end as bol from dual connect by level <= 10;

	RN	  BOL
---------- ----------
	 1	    0
	 2	    0
	 3	    1
	 4	    1
	 5	    1
	 6	    0
	 7	    0
	 8	    0
	 9	    0
	10	    0

10 rows selected.
SQL> with sub as ( 
  2  select level as rn,case when level between 3 and 5 then 1 else 0 end as bol from dual connect by level <= 10)select * from sub where bol = 1;

	RN	  BOL
---------- ----------
	 3	    1
	 4	    1
	 5	    1

範囲指定演算子のうごき

内部的にはパタンの真偽を判定している。

コード表示

[root@61eff46d2318 html]# seq 1 10 | awk 'NR%3==0,NR%2==0'
3
4
6
9
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%2==0,NR%3==0'
2
3
4
5
6
8
9
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%2==0'
2
4
6
8
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%3==0'
3
6
9

sql的には。。。

コード表示

SQL> select level as rn
  2  ,case when mod(level,3)=0 then 1 else 0 end as div3
  3  ,case when mod(level,2)=0 then 1 else 0 end as div2
  4  from dual connect by level <= 10;

	RN	 DIV3	    DIV2
---------- ---------- ----------
	 1	    0	       0
	 2	    0	       1
	 3	    1	       0
	 4	    0	       1
	 5	    0	       0
	 6	    1	       1
	 7	    0	       0
	 8	    0	       1
	 9	    1	       0
	10	    0	       1

10 rows selected.

sql的には。。。とかやってみたけど、理解できなかった。

コード表示

SQL> select level as rn
  2  ,case when greatest(2,3)<=level then 1 else 0 end as liner
  3  ,case when mod(level,3)=0 then 1 else 0 end as div3
  4  ,case when mod(level,2)=0 then 1 else 0 end as div2
  5  from dual connect by level <= 10;

	RN	LINER	    DIV3       DIV2
---------- ---------- ---------- ----------
	 1	    0	       0	  0
	 2	    0	       0	  1
	 3	    1	       1	  0
	 4	    1	       0	  1
	 5	    1	       0	  0
	 6	    1	       1	  1
	 7	    1	       0	  0
	 8	    1	       0	  1
	 9	    1	       1	  0
	10	    1	       0	  1

10 rows selected.

コンマ演算子と関係あると思ったけど、

seq 1 10 | awk ‘NR%2==0,NR%3==0’の結果で5が出力されて7が出力されない理由がわかれば、理解できるとは思った。awkってパタン真の奴出力されるんだよね。アクション省略されたら。

この範囲指定演算子は,カンマの前後がスイッチのように働きます.つまり,上記の場合には「組込変数 NR が 10 から組込変数 NR が 20 まで」という意味ではなく,「組込変数 NR が 10 になったらパターンを真にして,組込変数 NR が 20 になったらパターンを偽にする」という意味になるので注意しましょう。

とはあるけど、分からなかった。

ソースコードも見てみたけど分からなかった。なにで検索したらいいか分からなかった。またあとでしらべたい。

コード表示

[root@61eff46d2318 html]# cat /etc/red*
CentOS Linux release 7.6.1810 (Core) 
[root@61eff46d2318 gawk-4.0.2]# rpm -qfi `which awk`
Name        : gawk
Version     : 4.0.2
Release     : 4.el7_3.1
Architecture: x86_64
Install Date: Wed Mar  6 02:34:52 2019
Group       : Applications/Text
Size        : 2435978
License     : GPLv3+ and GPL and LGPLv3+ and LGPL and BSD
Signature   : RSA/SHA256, Thu Jun 29 21:40:38 2017, Key ID 24c6a8a7f4a80eb5
Source RPM  : gawk-4.0.2-4.el7_3.1.src.rpm
Build Date  : Thu Jun 29 06:52:50 2017
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem 
Vendor      : CentOS
URL         : http://www.gnu.org/software/gawk/gawk.html
Summary     : The GNU version of the awk text processing utility
Description :
The gawk package contains the GNU version of awk, a text processing
utility. Awk interprets a special-purpose programming language to do
quick and easy text pattern matching and reformatting jobs.

Install the gawk package if you need a text processing utility. Gawk is
considered to be a standard Linux tool for processing text.
[root@61eff46d2318 html]# curl -OL http://vault.centos.org/7.6.1810/os/Source/SPackages/gawk-4.0.2-4.el7_3.1.src.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2696k  100 2696k    0     0   927k      0  0:00:02  0:00:02 --:--:--  927k
[root@61eff46d2318 html]# ll
total 2700
-rw-r--r--. 1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
[root@61eff46d2318 html]# rpm2cpio *rpm | cpio -id
5388 blocks
[root@61eff46d2318 html]# ll
total 5400
-rw-r--r--. 1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
-rw-rw-r--. 1 root root     583 May  2 12:11 gawk-4.0.2-fix-chksize-calls.patch
-rw-rw-r--. 1 root root 2742713 May  2 12:11 gawk-4.0.2.tar.gz
-rw-rw-r--. 1 root root   14753 May  2 12:11 gawk.spec
[root@61eff46d2318 html]# tar -zxvf gawk-4.0.2.tar.gz
gawk-4.0.2/
gawk-4.0.2/version.in
.
.
.
[root@61eff46d2318 html]# ll
total 5408
drwxrwxr-x. 13 1000 1000    4096 Dec 26  2012 gawk-4.0.2
-rw-r--r--.  1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
-rw-rw-r--.  1 root root     583 May  2 12:11 gawk-4.0.2-fix-chksize-calls.patch
-rw-rw-r--.  1 root root 2742713 May  2 12:11 gawk-4.0.2.tar.gz
-rw-rw-r--.  1 root root   14753 May  2 12:11 gawk.spec
[root@61eff46d2318 gawk-4.0.2]# find . -name "*cnm*"
[root@61eff46d2318 gawk-4.0.2]# find . -name "*comma*"
./test/addcomma.ok
./test/addcomma.awk
./test/addcomma.in
./command.y
./command.c
[root@61eff46d2318 gawk-4.0.2]# find . -name "*ope*"
./vms/vms_popen.c
./pc/popen.c
./pc/popen.h

また戻ってこよう。これにてfin

finしてない。範囲演算子は‖とか&&とか<=,<,>,>=で書いていくのが読みやすいいよなきっと。

Leave a Reply

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