1

ファイルの13列目のすべての用船者の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)。

私のコードのどの部分がこのエラーの原因であるか知っていますか?!

4

2 に答える 2

2

これを試して:

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

\42is"\47is'であるため、これはprintf %d "'${char}"それぞれのシェルで実行され、POSIXprintf定義の§ExtendedDescription${char}の最後の箇条書きに記載されている数値を指示するPOSIX拡張機能を備えたC定数として評価をトリガーします。

注意:フォーマットは重要です!自分が何をしているのかを正確に理解していない限り、コードを絞り込もうとしないでください。

そして純粋な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)
    }'
于 2012-04-24T10:27:41.203 に答える
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)}'
于 2012-04-24T11:56:10.023 に答える