آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۵۷

پرسش و پاسخ شماره ۵۷

چطور می‌توانم اقلام را گروه‌بندی نمایم(در یک فایل با پیشوندهای مشترک)؟

چنان که شخصی بخواهد این فایل را:

    foo: entry1
    bar: entry2
    foo: entry3
    baz: entry4

تبدیل کند به این

    foo: entry1 entry3
    bar: entry2
    baz: entry4

دو روش ساده عمومی برای انجام این کار وجود دارد:

  1. مرتب نمودن فایل، و سپس تکرار روی آن، جمع آوری مدخل‌ها تا موقعی که پیشوند تغییر کند، و سپس چاپ مدخل‌های جمع آوری شده با پیشوند قبلی
  2. تکرار روی یک فایل، جمع آوری مدخل ها برای هر پیشوند در یک آرایه شاخص‌گذاری شده با پیشوند

یک پیاده‌سازی اساسی از روش a در bash:

old=xxx ; stuff=
(sort file ; echo xxx) | while read prefix line ; do 
        if [[ $prefix = $old ]] ; then
                stuff="$stuff $line"
        else
                echo "$old: $stuff"
                old="$prefix"
                stuff=
        fi
done 

و یک پیاده‌سازی اساسی از روش b در awk، با استفاده از آرایه چند بعدی:

    {
      a[$1,++b[$1]] = $2;
    }

    END {
      for (i in b) {
        printf("%s", i);
        for (j=1; j<=b[i]; j++) {
          printf(" %s", a[i,j]);
        }
        print "";
      }
    }

نوشته شده به صورت یک سطر دستور مفصل در پوسته:

    awk '{a[$1,++b[$1]]=$2} END {for (i in b) {printf("%s", i); for (j=1; j<=b[i]; j++) printf(" %s", a[i,j]); print ""}}' file

پرسش و پاسخ 57 آخرین ویرایش ‎ 2012-03-29 20:36:56 ‎ توسط ormaaj)