سؤال

يجب أن أعالج بعض الملفات الضخمة مع Gawk. مشكلتي الرئيسية هي أنه يجب علي طباعة بعض العوامات باستخدام ألف فواصل. على سبيل المثال: 10000 يجب أن تظهر كما 10.000 و 10000,01 كما 10.000,01 في الإخراج.

أنا (وجوجل) توصلت إلى هذه الوظيفة، لكن هذا فشل في العوامات:

function commas(n) {
  gsub(/,/,"",n)
  point = index(n,".") - 1
  if (point < 0) point = length(n)
    while (point > 3) {
      point -= 3
      n = substr(n,1,point)"."substr(n,point + 1)
    }
  sub(/-\./,"-",n)
  return d n
}

لكنه فشل مع العوامات.

الآن أفكر في تقسيم المدخلات إلى عدد صحيح و <1 جزء، ثم بعد تهيئة عدد صحيح الإلتصاق مرة أخرى، ولكن ليس هناك طريقة أفضل للقيام بذلك؟

تنصل:

  • أنا لست مبرمج
  • أعلم أنه عبر بعض قذيفة Env. المتغيرات يمكن تعيين ألف فواصل، ولكن يجب أن تعمل في بيئات مختلفة مع إعدادات Lang و / أو لغة مختلفة.
  • اللغة الإنجليزية هي لغتي الثانية، آسف إذا كنت أستخدمها بشكل غير صحيح
هل كانت مفيدة؟

المحلول

فشل مع العوامات لأنك تمر بأرقام من النوع الأوروبي (1.000،25،25 مقابل مليون وربع). يجب أن تعمل الوظيفة التي قدمتها إذا قمت فقط بتغيير الفواصل وفتراتها. سأختبر الإصدار الحالي أولا ب 1000000.25 لمعرفة ما إذا كان يعمل مع الأرقام غير الأوروبية.

يمكن استدعاء البرنامج النصي AWK التالي "echo 1 | awk -f xx.gawk" وسوف تظهر لك كل من النسخة "الطبيعية" والأوروبية في العمل. مخرجاتها:

123,456,789.1234
123.456.789,1234

من الواضح، أنت مهتم فقط بالوظائف، وسيستخدم رمز العالم الحقيقي دفق الإدخال لتمرير القيم إلى الوظائف، وليس سلسلة ثابتة.

function commas(n) {
    gsub(/,/,"",n)
    point = index(n,".") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)","substr(n,point + 1)
    }
    return n
}
function commaseuro(n) {
    gsub(/\./,"",n)
    point = index(n,",") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)"."substr(n,point + 1)
    }
    return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }

المهام متطابقة إلا في التعامل مع الفواصل وفتراتهم. سنقوم بتسمية الفواصل والكورساليات في الوصف التالي:

  • يزيل GSUB جميع الفواصل الحالية منذ أن نعيدهم.
  • تجد النقطة حيث يكون العشرية لأن هذه نقطة البداية لدينا.
  • إذا لم يكن هناك عشري، فإن البيان إذا بدأ في النهاية.
  • نحن حلقة بينما هناك أكثر من ثلاثة أحرف اليسار.
  • داخل الحلقة، نقوم بضبط الموضع لإدراج فاصل، وإدراجه.
  • بمجرد الانتهاء من الحلقة، نعود القيمة المعدلة.

نصائح أخرى

للذهاب مع إجابة باكس:

اقرأ قسم "التحويل" من دليل جنو AWK التي تتحدث صراحة عن تأثير الخاص بك LOCALE متغير البيئة في سلسلة تمثيل الأنواع الرقمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top