سؤال

لقد واجهت مشكلة متابعة مع وظيفة Asorti's Gawk:

gawk 'BEGIN{ \

  a[1]=6; \

  a[2]=7; \

  a[3]=8; \

  a[21]=9; \

  a[123]=10; \

  t=asorti(a, o); \

  for (i=1; i<=t; i++) { \

    print i,o[i]; \

  } \

}'

النتيجه هي:

1 1

2 123

3 2

4 21

5 3

لذلك ، من الواضح أن المؤشرات المفرومة في ترتيب معجمي ، لكن Doc's Doc (ASORT (S [، D])):

"يتم فرز محتويات S باستخدام قواعد Gawk العادية لمقارنة القيم ..."

ومع ذلك ، عندما أقوم بنسخ المؤشرات إلى صفيف مؤقت ، وفرز تلك المجموعة الجديدة باستخدام ASORT () ،

يبدو جيدًا (باستخدام شيء مثل):

j=1; for(e in a) { temp[j++] = e; }

هل سأفعل ذلك ، أم أنها مشكلة مع Gawk's Asorti ()؟

هل كانت مفيدة؟

المحلول

بحسب ال دليل جوك: "جانب مهم حول المصفوفات التي يجب تذكرها هو ذلك مشتركات الصفيف هي دائما سلاسل."

نصائح أخرى

أعلم أن هناك قيودًا على Gawk 3 ، ولكن على Gawk 4 (على الأقل في 4.1.1) إنها تافهة:

t=asorti(a, o, "@ind_num_asc");

كحل بديل ، يمكنك استخدام شيء مثل هذا (قد تحتاج إلى ضبط الحشو):

gawk 'BEGIN { 
  a[1] = 6; a[2] = 7; a[3] = 8; a[21] = 9; a[123] = 10; 
  for (i in a) io[sprintf("%15s", i)] = a[i]
  t = asorti(io, o)
  for (i = 0; ++i <= t;) print i, o[i] + 0
    }'

مع GNU AWK ، يمكنك حتى الحفاظ على المفاتيح/الفهارس الأصلية:

WHINY_USERS=oops gawk 'BEGIN { 
  a[1]=6; a[2]=7; a[3]=8; a[21]=9; a[123]=10; 
  for (i in a) o[sprintf("%15s", i)] = a[i]
  for (i in o) print i + 0, o[i]
    }'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top