تقسیم یک فایل به چند فایل کوچک‌تر با استفاده از awk

یادمه اون موقع که حرف از کامپایلر می‌زدیم، حرف از Aho هم می‌زدیم، بعدها بزرگ‌تر شدیم و وقتی از الگوریتم Aho-Corasick حرف می‌زدیم، ناخواسته از Aho حرف می‌زدیم و می‌گفتیم grep هم از Aho-Corasick استفاده می‌کنه، انقدر الگوریتم خوبیه. بزرگ‌تر شدیم و از grep استفاده می‌کردیم می‌گفتیم چیز خوبیه، خیلی بدرد می‌خوره، دمشون گرم چی نوشتن. یخورده دیگه بزرگ‌تر شدیم اومدیم از awk استفاده کنیم، دیدیم ای دل غافل اینم که Aho, Weinberger, Kernighan نوشتن. خلاصه که Aho آدم بزرگیه

از این داستان ابتدای پست بگذریم، چند وقت پیش لازم بود یک فایل چند گیگی رو به چند فایل کوچک‌تر تقسیم کنیم، به این صورت که سطر‌هایی که دسته‌بندی مشترکی دارند توی یک فایل قرار بگیرند. اینجا بود که دست به دامان awk شدیم. اول لازم بود هر سطر فایل رو با ویرگول جدا کنیم تا بتونیم دسته‌بندی رو بعد از اولین ویرگول بدست بیاریم

1
awk -F, '{print $2}' input.csv

بعد اون لازم بود که سطر مورد پردازش رو به فایل دسته‌بندی خودش اضافه کنیم.

1
awk -F, '{print >> ($2".csv")}' input.csv

کار تمومه :) اگه ما توی فایل input.csv چهارتا دسته‌بندی داشته باشیم، با اجرای این دستور سطر‌های فایل اصلی برحسب دسته‌بندی خودشون به چهارتا فایل تقسیم می‌شن.

!!! اگه با مک کار می‌کنید و لینوکسی نیستید ی قدم دیگه هم جلوتر برید، چون توی مک فایل‌هایی که باز می‌شن تا سطری به اونها اضافه بشه خودبه‌خود بسته نمی‌شن و ما باید از دستور close برای بستن فایل استفاده کنیم وگرنه با خطای ‍makes too many open files مواجه می‌شیم.

1
awk -F, '{print >> ($2".csv"); close($2".csv")}' input.csv

این رو هم اضافه کنم که توی رفرنس‌ها هرچی تب باز از awk داشتم رو لینک دادم و الزاما از اون‌ها برای این چهار خط مطلب استفاده نکردم.

References: