0

ファイルにこのデータがあります

 65 ---
 66 FieldType: Text
 67 FieldName: STATE
 68 FieldNameAlt: STATE
 69 FieldFlags: 4194304
 70 FieldJustification: Left
 71 FieldMaxLength: 2
 72 ---
 73 FieldType: Text
 74 FieldName: ZIP
 75 FieldNameAlt: ZIP
 76 FieldFlags: 0
 77 FieldJustification: Left
 78 ---
 79 FieldType: Signature
 80 FieldName: EMPLOYEE SIGNATURE
 81 FieldNameAlt: EMPLOYEE SIGNATURE
 82 FieldFlags: 0
 83 FieldJustification: Left
 84 ---
 85 FieldType: Text
 86 FieldName: Name_Last
 87 FieldNameAlt: LAST
 88 FieldFlags: 0
 89 FieldValue: Billa
 90 FieldJustification: Left
 91 ---

それを配列にして、キーと値のペアとして配列に保存するにはどうすればよいですか

array['fieldtype']
array['fieldName']

すべてのオブジェクトに対して。

セパレーターは「---」だけだと思いますが、どうすればそれができるのかわかりません

4

3 に答える 3

1

GNU awk の 1 つの方法を次に示します。入力をレコードに分割し、後で作業できるようにします。

parse.awk

BEGIN {
  RS = " +[0-9]+ +---\n"
  FS = "\n"
}

{
  for(i=1; i<=NF; i++) {             # for each line
    sf = split($i, a, ":")
    if(sf > 1) {                     # only accept successfully split lines
      sub("^ +[0-9]+ +", "", a[1])   # trim key
      sub("^ +", "",  a[2])          # trim value
      array[a[1]] = a[2]             # save into array hash
    }
  }
}

{
  print "Record: " NR
  for(k in array) {
    print k " -> " array[k]
  }
  print ""
}

上記をparse.awkに保存し、次のように実行します。

awk -f parse.awk infile

infile解析するデータが含まれている場所。出力:

Record: 1

Record: 2
FieldFlags -> 4194304
FieldNameAlt -> STATE
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldName -> STATE

Record: 3
FieldFlags -> 0
FieldNameAlt -> ZIP
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldName -> ZIP

Record: 4
FieldFlags -> 0
FieldNameAlt -> EMPLOYEE SIGNATURE
FieldJustification -> Left
FieldType -> Signature
FieldMaxLength -> 2
FieldName -> EMPLOYEE SIGNATURE

Record: 5
FieldFlags -> 0
FieldNameAlt -> LAST
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldValue -> Billa
FieldName -> Name_Last
于 2012-11-12T08:45:41.133 に答える
0

任意のタイプの awk で:

#!awk -F':[[:blank:]]*' -f
BEGIN {
    counter = 0
}
/:/ {
    array[counter,$1] = $2
}
/---/ {
    counter++;
}
END {
  # Deal with the array.
}

これにより、「counter」によって数えられた各セルに配列 [x,key] = 値で説明したフィールドが含まれる配列が作成されます。

于 2012-11-13T03:30:34.717 に答える
0

次のようなものを使用できます。

sed -n '/FieldType/,/FieldName/{N};s/FieldType: \([^\n]*\)\nFieldName: \([^\n]*\)/a["\2"]=\1/gp' input >> tmp.sh

そして、やります:

source tmp.sh

またはevalリダイレクトとの代わりに使用sourceしますが、従業員の署名フィールドにスペースがあると問題が発生します。

ただし、Perl を使用する方が理にかなっています。

于 2012-11-12T08:43:55.020 に答える