[20210924]awk奇怪的輸出.txt

lfree發表於2021-09-24

[20210924]awk奇怪的輸出.txt

--//昨天在分析問題時使用awk,遇到一些奇怪的問題,做一個記錄並加入自己的理解與分析:
.
1.環境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

2.測試:
$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where 1=0;"
no rows selected

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;"
     EMPNO     DEPTNO        SAL
---------- ---------- ----------
      7369         20        800
      7499         30       1600
      7521         30       1250
      7566         20       2975
      7654         30       1250

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2>=30 {print $0 }'
     EMPNO     DEPTNO        SAL
      7499         30       1600
      7521         30       1250
      7654         30       1250

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2==30 {print $0 }'
      7499         30       1600
      7521         30       1250
      7654         30       1250

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2==20 {print $0 }'
      7369         20        800
      7566         20       2975

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2==20 && $3>=1000 {print $0 }'
      7566         20       2975

--//注:windows下使用cygwin輸出文字帶有\r,必須過濾掉,不然輸出混亂.
--//你可以發現一個現象,使用awk過濾,有時輸出header有一些沒有,但是不會輸出分隔線---.為什麼呢?
--// 字元 - 2 3 D對應的ascii碼如下:
--// - = 2d
--// 2 = 32
--// 3 = 33
--// D = 44

--//你可以發現條件 $2>=30 出現header的主要原因是awk把它當作字串處理的,或者講當$2是字串時,條件變成了 $2 >= '30';這樣輸
--//出在條件$2>=30的情況下輸出header就很正常了.等價於如下:

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2>='30' {print $0 }'
     EMPNO     DEPTNO        SAL
      7499         30       1600
      7521         30       1250
      7654         30       1250

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" | tr -d '\r' | awk '$2>="30" {print $0 }'
     EMPNO     DEPTNO        SAL
      7499         30       1600
      7521         30       1250
      7654         30       1250
      
--//如何取消呢?很簡單加入一點點運算,修改如下:

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" 2>&1 | tr -d '\r' | awk '$2*1>=30 {print $0 }'
      7499         30       1600
      7521         30       1250
      7654         30       1250

$ sqlplus -s -l scott/btbtms@test01p <<< "select empno,deptno,sal from emp where rownum<=5;" 2>&1 | tr -d '\r' | awk '$2+0>=30 {print $0 }'
      7499         30       1600
      7521         30       1250
      7654         30       1250

--//將條件修改為$2*1>=30 或者 $2+0 >=30 就可以過濾header.
--//不知道各位還有什麼好方法,大家給一個建議.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2793404/,如需轉載,請註明出處,否則將追究法律責任。

相關文章