2012-04-24 30 views
0

檢索文件的第13列所有承租人的ASCII碼我寫這個劇本獲取ASCII碼?

awk -v ch="'" '{ 
for (i=1;i<=length(substr($13,6,length($13)));i++) 
{cmd = printf \"%d\\n\" \"" ch substr(substr($13,6,length($13)),i,1) "\"" cmd | getline output close(cmd) ; 
Number= Number " " output 
} 
print Number ; Number="" 
}' ~/a.test 

,但它不以正確的方式工作!我的意思是,它工作得很好,然後產生奇怪的結果!? 作爲一個例子,對於該輸入(假設它是列第13次)

CQ:Z:%8 %%%% 0 %%%% 9 %%%%:%%%%%%%%% %%%%%%%%%

我一定要得到這個

37 56 37 37 37 37 48 37 37 37 37 57 37 37 37 37 58 37 37 37 37 ... ............

但我有這個

37 56 37 37 37 37 48 48 48 48 48 57 57 57 57 57 58 58 58 58 58 ...............

,你可以在字符「0」後面出現第一個未命中計算(結果爲48)。

你知道我的代碼的哪個部分是對這個錯誤負責麼?

回答

1

試試這個:

awk '{ 
    str = substr($13, 6) 
    for (i=1; i<=length(str); i++) { 
     cmd = "printf %d \42\47" substr(str, i, 1) "\42"  
     cmd | getline output 
     close(cmd) 
     Number= Number " " output 
    } 
    print Number 
    Number="" 
    }' ~/a.test 

注:格式化很重要! 不要試圖擠壓的代碼,除非你確切知道你在做什麼!

和純AWK溶液(我把ORD/CHR直接功能從手動):

printf '%s\n' 'CQ:Z:%8%%%%0%%%%9%%%%:%%%%%%%%%%%%%%%%%%'| 
    awk 'BEGIN { _ord_init() } 
    { 
     str = substr($0, 6) 
     for (i = 0; ++i <= length(str);) 
     printf "%s", (ord(substr(str, i, 1)) (i < length(str) ? OFS : ORS)) 
     } 
    func _ord_init( low, high, i, t) { 
     low = sprintf("%c", 7) # BEL is ascii 7 
     if (low == "\a") {  # regular ascii 
     low = 0 
     high = 127 
     } 
     else if (sprintf("%c", 128 + 7) == "\a") { 
     # ascii, mark parity 
     low = 128 
     high = 255 
     } 
     else {     # ebcdic(!) 
     low = 0 
     high = 255 
     } 

    for (i = low; i <= high; i++) { 
     t = sprintf("%c", i) 
     _ord_[t] = i 
     } 
    } 

    func ord(str, c) { 
    # only first character is of interest 
    c = substr(str, 1, 1) 
    return _ord_[c] 
    } 

    func chr(c) { 
    # force c to be numeric by adding 0 
    return sprintf("%c", c + 0) 
    }' 
+0

這太糟糕了, AWK(和gawk)沒有這個[POSIX'printf(1)'特性](http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html)(見擴展描述末尾附近)在其內置的'printf'中。 – 2013-09-08 21:12:36

0

這可能會爲你工作:

awk -vSQ="'" -vDQ='"' '{args=space="";n=split($13,a,"");for(i=1;i<=n;i++){args=args space DQ SQ a[i] DQ;format=format space "%d";space=" "};format=DQ format "\\n" DQ;system("printf " format " " args)}' 
+0

謝謝potong是的,它的工作 – khikho 2012-04-24 13:08:22

+0

你能解釋一下代碼嗎?謝謝。 – 2017-09-03 12:04:18