'\" t .\" Title: mlr .\" Author: [see the "AUTHOR" section] .\" Generator: ./mkman.rb .\" Date: 2026-08-10 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" .TH "MILLER" "1" "2026-08-10" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Portability definitions .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq (aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .SH "نام (NAME)" .sp mlr \- ابزاری مانند awk، sed، cut، join و sort برای داده‌های دارای نمایه با نام مانند CSV و JSON جدولی .SH "خلاصه دستور (SYNOPSIS)" .sp کاربرد: mlr [flags] [verb] [verb-dependent options ...] {صفر یا چند نام فایل} اگر هیچ verbای مشخص نشود، "cat" استفاده می‌شود که برای تبدیل قالب‌ها مناسب است؛ مانند: mlr --c2j < example.csv اگر هیچ نام فایلی مشخص نشود، ورودی استاندارد خوانده می‌شود؛ مانند: mlr --csv sort -f shape example.csv خروجی یک verb می‌تواند با استفاده از "then" به عنوان ورودی به verb دیگری متصل شود؛ مانند: mlr --csv stats1 -a min,mean,max -f quantity then sort -f color example.csv لطفاً برای اطلاعات بیشتر 'mlr help topics' را ببینید. لطفاً همچنین https://miller.readthedocs.io را ببینید. .SH "توضیحات (DESCRIPTION)" .sp Miller بر روی داده‌های جفت کلید-مقدار (key-value-pair) عمل می‌کند، در حالی که ابزارهای نام‌آشنای یونیکس روی فیلدهای با نمایه عدد صحیح کار می‌کنند: اگر ساختار داده طبیعی برای ابزارهای یونیکس آرایه باشد، ساختار داده طبیعی Miller جدول درهم‌سازی با حفظ ترتیب درج (insertion-ordered hash map) است. این گستره متنوعی از قالب‌های داده را در بر می‌گیرد، از جمله قالب‌های نام‌آشنای CSV، TSV و JSON (هرچند محدود به آن‌ها نیست). (Miller همچنین می‌تواند به عنوان یک حالت خاص، داده‌های دارای نمایه موقعیتی را مدیریت کند.) این صفحه راهنما نسخه 6.21.0 برنامه mlr را مستند می‌کند. .SH "مثال‌ها (EXAMPLES)" .sp .if n \{\ .RS 0 .\} .nf mlr --icsv --opprint cat example.csv mlr --icsv --opprint sort -f shape example.csv mlr --icsv --opprint sort -f shape -nr index example.csv mlr --icsv --opprint cut -f flag,shape example.csv mlr --csv filter '$color == "red"' example.csv mlr --icsv --ojson put '$ratio = $quantity / $rate' example.csv mlr --icsv --opprint --from example.csv sort -nr index then cut -f shape,quantity .fi .if n \{\ .RE .SH "قالب‌های فایل (FILE FORMATS)" .if n \{\ .RS 0 .\} .nf CSV/CSV-lite: مقادیر جداشده با کاما با سطر سرآیند مجزا TSV: همان، اما با تب به‌جای کاما +---------------------+ | apple,bat,cog | | 1,2,3 | Record 1: "apple":"1", "bat":"2", "cog":"3" | 4,5,6 | Record 2: "apple":"4", "bat":"5", "cog":"6" +---------------------+ JSON (آرایه‌ای از اشیاء): +---------------------+ | [ | | { | | "apple": 1, | Record 1: "apple":"1", "bat":"2", "cog":"3" | "bat": 2, | | "cog": 3 | | }, | | { | | "dish": { | Record 2: "dish.egg":"7", | "egg": 7, | "dish.flint":"8", "garlic":"" | "flint": 8 | | }, | | "garlic": "" | | } | | ] | +---------------------+ JSON Lines (دنباله‌ای از اشیاء تک‌خطی): +------------------------------------------------+ | {"apple": 1, "bat": 2, "cog": 3} | | {"dish": {"egg": 7, "flint": 8}, "garlic": ""} | +------------------------------------------------+ Record 1: "apple":"1", "bat":"2", "cog":"3" Record 2: "dish:egg":"7", "dish:flint":"8", "garlic":"" YAML (تک‌سند = شیء یا آرایه‌ای از اشیاء؛ چندین سند با ---): +---------------------+ | apple: 1 | | bat: 2 | Record 1: "apple":"1", "bat":"2", "cog":"3" | cog: 3 | | --- | | dish: 7 | Record 2: "dish":"7", "egg":"8" | egg: 8 | +---------------------+ PPRINT: جدول قالب‌بندی‌شده زیبا (pretty-printed) +---------------------+ | apple bat cog | | 1 2 3 | Record 1: "apple:"1", "bat":"2", "cog":"3" | 4 5 6 | Record 2: "apple":"4", "bat":"5", "cog":"6" +---------------------+ Markdown tabular: جدول مارک‌داون +-----------------------+ | | apple | bat | cog | | | | --- | --- | --- | | | | 1 | 2 | 3 | | Record 1: "apple:"1", "bat":"2", "cog":"3" | | 4 | 5 | 6 | | Record 2: "apple":"4", "bat":"5", "cog":"6" +-----------------------+ XTAB: جدول ترانهاده قالب‌بندی‌شده زیبا +---------------------+ | apple 1 | Record 1: "apple":"1", "bat":"2", "cog":"3" | bat 2 | | cog 3 | | | | dish 7 | Record 2: "dish":"7", "egg":"8" | egg 8 | +---------------------+ DKVP: جفت‌های کلید-مقدار تحدیدشده (قالب پیش‌فرض Miller) +---------------------+ | apple=1,bat=2,cog=3 | Record 1: "apple":"1", "bat":"2", "cog":"3" | dish=7,egg=8,flint | Record 2: "dish":"7", "egg":"8", "3":"flint" +---------------------+ DKVPX: جفت‌های کلید-مقدار تحدیدشده با نقل‌قول به سبک CSV +----------------------------------+ | apple=1,bat=2,cog=3 | Record 1: "apple":"1", "bat":"2", "cog":"3" | "x,y"="a,b,c",z=3 | Record 2: "x,y":"a,b,c", "z":"3" +----------------------------------+ NIDX: نمایه‌گذاری عددی ضمنی (به سبک ابزارهای یونیکس) +---------------------+ | the quick brown | Record 1: "1":"the", "2":"quick", "3":"brown" | fox jumped | Record 2: "1":"fox", "2":"jumped" +---------------------+ DCF: قالب فایل کنترلی دبیان +------------+ | apple: 1 | | bat: 2 | | cog: 3 | | | | dish: 7 | | egg: 8 | | 3: flint | +------------+ .fi .if n \{\ .RE.SH "گزینه‌های راهنما (HELP OPTIONS)" .if n \{\ .RS 0 .\} .nf برای هر یک از موارد زیر عبارت 'mlr help {topic}' را وارد کنید: ضروریات: mlr help topics mlr help basic-examples mlr help file-formats پرچم‌ها: mlr help flags mlr help flag mlr help list-separator-aliases mlr help list-separator-regex-aliases mlr help comments-in-data-flags mlr help compressed-data-flags mlr help csv/tsv-only-flags mlr help dkvp-only-flags mlr help file-format-flags mlr help flatten-unflatten-flags mlr help format-conversion-keystroke-saver-flags mlr help json-only-flags mlr help legacy-flags mlr help markdown-only-flags mlr help miscellaneous-flags mlr help output-colorization-flags mlr help pprint-only-flags mlr help profiling-flags mlr help separator-flags فعل‌ها: mlr help list-verbs mlr help usage-verbs mlr help verb توابع: mlr help list-functions mlr help list-function-classes mlr help list-functions-in-class mlr help usage-functions mlr help usage-functions-by-class mlr help function کلیدواژه‌ها: mlr help list-keywords mlr help usage-keywords mlr help keyword سایر موارد: mlr help auxents mlr help terminals mlr help mlrrc mlr help output-colorization mlr help type-arithmetic-info mlr help type-arithmetic-info-extended میان‌برها: mlr -g = mlr help flags mlr -l = mlr help list-verbs mlr -L = mlr help usage-verbs mlr -f = mlr help list-functions mlr -F = mlr help usage-functions mlr -k = mlr help list-keywords mlr -K = mlr help usage-keywords در نهایت، 'mlr help ...' متن دقیق '...' را با استفاده از منابع \(cqmlr help flag'، 'mlr help verb'، 'mlr help function' و 'mlr help keyword' جستجو خواهد کرد. برای تطابق‌های تقریبی (زیررشته) از 'mlr help find ...' استفاده کنید، مانند 'mlr help find map' برای همه مواردی که "map" در نام آن‌ها وجود دارد. .fi .if n \{\ .RE .SH "فهرست فعل‌ها (VERB LIST)" .if n \{\ .RS 0 .\} .nf altkv bar bootstrap bootstrap-ci case cat check clean-whitespace count-distinct count count-similar cut decimate describe fill-down fill-empty filter flatten format-values fraction gap grep group-by group-like gsub having-fields head histogram json-parse json-stringify join label latin1-to-utf8 least-frequent merge-fields most-frequent nest nothing put rank regularize remove-empty-columns rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records sort sort-within-records sparkline sparsify split ssub stats1 stats2 step sub summary surv tac tail tee template top utf8-to-latin1 unflatten uniq unspace unsparsify .fi .if n \{\ .RE .SH "فهرست توابع (FUNCTION LIST)" .if n \{\ .RS 0 .\} .nf abs acos acosh antimode any append apply arrayify asin asinh asserting_absent asserting_array asserting_bool asserting_boolean asserting_bytes asserting_empty asserting_empty_map asserting_error asserting_float asserting_int asserting_map asserting_nonempty_map asserting_not_array asserting_not_empty asserting_not_map asserting_not_null asserting_null asserting_numeric asserting_present asserting_string atan atan2 atanh base64_decode base64_encode bitcount boolean bytes capitalize cbrt ceil clean_whitespace collapse_whitespace concat contains cos cosh count depth dhms2fsec dhms2sec distinct_count erf erfc every exec exp expm1 flatten float floor fmtifnum fmtnum fold format fsec2dhms fsec2hms get_keys get_values gmt2localtime gmt2nsec gmt2sec gssub gsub haskey hasvalue hex_decode hex_encode hexfmt hms2fsec hms2sec hostname index int invqnorm is_absent is_array is_bool is_boolean is_bytes is_empty is_empty_map is_error is_float is_int is_map is_nan is_nonempty_map is_not_array is_not_empty is_not_map is_not_null is_null is_numeric is_present is_string joink joinkv joinv json_parse json_stringify kurtosis latin1_to_utf8 leafcount leftpad length localtime2gmt localtime2nsec localtime2sec log log10 log1p logifit lstrip madd mapdiff mapexcept mapselect mapsum max maxlen md5 mean meaneb median mexp min minlen mmul mode msub next nsec2gmt nsec2gmtdate nsec2localdate nsec2localtime null_count os percentile percentiles pow qnorm reduce regextract regextract_or_else rightpad round roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms sec2localdate sec2localtime select sgn sha1 sha256 sha512 sin sinh skewness sort sort_collection sparkline splita splitax splitkv splitkvx splitnv splitnvx sqrt ssub stat stddev strfntime strfntime_local strftime strftime_local string strip strlen strmatch strmatchx strpntime strpntime_local strptime strptime_local sub substr substr0 substr1 sum sum2 sum3 sum4 sysntime system systime systimeint tan tanh tolower toupper truncate typeof unflatten unformat unformatx upntime uptime urand urand32 urandelement urandint urandrange utf8_to_latin1 variance version ! != !=~ % & && * ** + - . \&.* .+ .- ./ / // < << <= <=> == =~ > >= >> >>> ?: ?? ??? ^ ^^ | || ~ .fi .if n \{\ .RE.SH "پرچم‌های کامنت در داده (COMMENTS-IN-DATA FLAGS)" .sp .if n \{\ .RS 0 .\} .nf Miller به شما امکان می‌دهد در داده‌های خود کامنت قرار دهید، مانند: # This is a comment for a CSV file a,b,c 1,2,3 4,5,6 نکات: * کامنت‌ها فقط در ابتدای یک خط پذیرفته می‌شوند. * در صورت نبود هر یک از چهار گزینه زیر، کامنت‌ها مانند هر متن دیگری داده به شمار می‌روند. (قابلیت کامنت در داده اختیاری (opt-in) است.) * هنگامی که `--pass-comments` استفاده شود، خطوط کامنت بلافاصله پس از خوانده شدن در خروجی استاندارد نوشته می‌شوند؛ آن‌ها بخشی از جریان رکوردها نیستند. نتایج ممکن است دور از انتظار باشد. پیشنهاد می‌شود کامنت‌ها را در ابتدای فایل‌های داده قرار دهید. --pass-comments چاپ فوری خطوط کامنت‌گذاری‌شده (دارای پیشوند `#`) درون ورودی. --pass-comments-with {string} چاپ فوری خطوط کامنت‌گذاری‌شده درون ورودی، با پیشوند مشخص‌شده. برای قالب ورودی CSV، پیشوند باید یک تک‌نویسه باشد. --skip-comments نادیده‌گرفتن خطوط کامنت‌گذاری‌شده (دارای پیشوند `#`) درون ورودی. --skip-comments-with {string} نادیده‌گرفتن خطوط کامنت‌گذاری‌شده درون ورودی، با پیشوند مشخص‌شده. برای قالب ورودی CSV، پیشوند باید یک تک‌نویسه باشد. .fi .if n \{\ .RE .SH "پرچم‌های داده‌های فشرده (COMPRESSED-DATA FLAGS)" .sp .if n \{\ .RS 0 .\} .nf Miller چند روش مختلف را برای خواندن فایل‌های داده که فشرده شده‌اند ارائه می‌دهد. * فشرده‌گشایی درون فرایند خود Miller انجام می‌شود: `--bz2in` `--gzin` `--zin``--zstdin` * فشرده‌گشایی بیرون از فرایند Miller انجام می‌شود: `--prepipe` `--prepipex` با استفاده از `--prepipe` و `--prepipex` می‌توانید عملیاتی را برای اجرا روی هر فایل ورودی مشخص کنید. دستور prepipe باید بتواند از ورودی استاندارد بخواند؛ این دستور به صورت `{command} < {filename}` فراخوانی می‌شود. دستور prepipex باید نام یک فایل را به عنوان آرگومان دریافت کند؛ این دستور به صورت `{command} {filename}` فراخوانی خواهد شد. مثال‌ها: mlr --prepipe gunzip mlr --prepipe zcat -cf mlr --prepipe xz -cd mlr --prepipe cat توجه داشته باشید که این ویژگی بسیار کلی است و به ابزارهای فشرده‌گشایی محدود نمی‌شود. می‌توانید از آن برای اعمال فیلترهای دلخواه روی تک‌تک فایل‌ها استفاده کنید. برای فشرده‌سازی خروجی (یا سایر ابزارها)، کافی است خروجی را پایپ کنید: `mlr ... | {your compression command} > outputfilenamegoeshere` در نهایت، توجه داشته باشید که اگر `--prepipe` یا `--prepipex` مشخص شود، جایگزین هر تصمیمی می‌شود که ممکن بود بر اساس پسوند فایل گرفته شود. به همین ترتیب، در صورت مشخص شدن `--prepipe`، گزینه‌های `--gzin`/`--bz2in`/`--zin``--zin` نادیده گرفته می‌شوند. --bz2in فشرده‌گشایی bzip2 درون فرایند Miller. در صورتی که فایل به `.bz2` ختم شود، به طور پیش‌فرض انجام می‌شود. --gzin فشرده‌گشایی gzip درون فرایند Miller. در صورتی که فایل به `.gz` ختم شود، به طور پیش‌فرض انجام می‌شود. --prepipe {decompression command} البته می‌توانید برای فایل‌های ورودی تکی، از پیش بدون این گزینه کار کنید، مثلاً `gunzip < myfile.csv.gz | mlr ...`. در خط فرمان مجاز است، اما در `.mlrrc` برای جلوگیری از اجرای کدهای غیرمنتظره مجاز نیست. --prepipe-bz2 مشابه `--prepipe bz2`، با این تفاوت که در `.mlrrc` مجاز است. --prepipe-gunzip مشابه `--prepipe gunzip`، با این تفاوت که در `.mlrrc` مجاز است. --prepipe-zcat مشابه `--prepipe zcat`، با این تفاوت که در `.mlrrc` مجاز است. --prepipe-zstdcat مشابه `--prepipe zstdcat`، با این تفاوت که در `.mlrrc` مجاز است. --prepipex {decompression command} مانند `--prepipe` با یک استثنا: در زمان اجرا علامت `<` را میان دستور و نام فایل درج نمی‌کند. برای برخی دستورها مانند `unzip -qc` که از ورودی استاندارد نمی‌خوانند مفید است. در خط فرمان مجاز است، اما در `.mlrrc` برای جلوگیری از اجرای کدهای غیرمنتظره مجاز نیست. --zin فشرده‌گشایی zlib درون فرایند Miller. در صورتی که فایل به `.z` ختم شود، به طور پیش‌فرض انجام می‌شود. --zstdin فشرده‌گشایی zstd درون فرایند Miller. در صورتی که فایل به `.zstd` ختم شود، به طور پیش‌فرض انجام می‌شود. .fi .if n \{\ .RE .SH "پرچم‌های فقط CSV/TSV (CSV/TSV-ONLY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که برای قالب CSV کاربرد دارند. --allow-ragged-csv-input یا --ragged یا --allow-ragged-tsv-input اگر یک سطر داده فیلدهای کمتری نسبت به سطر سرآیند داشته باشد، کلیدهای باقی‌مانده را با رشته خالی پر می‌کند. اگر یک سطر داده فیلدهای بیشتری نسبت به سطر سرآیند داشته باشد، همانند حالت implicit-header از برچسب‌های فیلد عددی صحیح استفاده می‌کند. --csv-trim-leading-space فاصله‌های ابتدایی را در داده‌های CSV حذف می‌کند. از این گزینه برای داده‌هایی مانند '"foo", "bar' استفاده کنید که با RFC-4180 سازگار نیستند، اما متداول هستند. --headerless-csv-output یا --ho یا --headerless-tsv-output تنها سطرهای داده CSV/TSV را چاپ می‌کند؛ سطرهای سرآیند CSV/TSV را چاپ نمی‌کند. --implicit-csv-header یا --headerless-csv-input یا --hi یا --implicit-tsv-header استفاده از 1,2,3,... به عنوان برچسب فیلدها، به جای استفاده از سطر ۱ فایل‌های ورودی. نکته: برای ایجاد مجدد سرآیندهای ناموجود، آن را با `label` ترکیب کنید. --lazy-quotes کوتیشن‌های موجود در فیلدهای بدون نقل‌قول، و کوتیشن‌های غیرمضاعف در فیلدهای دارای نقل‌قول را می‌پذیرد. --no-auto-unsparsify برای خروجی CSV/TSV: اگر کلیدهای رکورد از یک سطر به سطر دیگر تغییر کنند، یک خط خالی و یک سطر سرآیند جدید صادر می‌کند. این رفتار با RFC 4180 سازگار نیست اما برای داده‌های ناهمگن مفید است. --no-implicit-csv-header یا --no-implicit-tsv-header برعکس `--implicit-csv-header`. این رفتار در هر حال پیش‌فرض است -- کاربرد اصلی آن برای پرچم‌های دستور `mlr join` است در صورتی که فایل(های) اصلی بدون سرآیند دارید اما می‌خواهید فایلی را پیوند دهید که سرآیند CSV/TSV دارد. در این حالت می‌توانید از دستور زیر استفاده کنید: `mlr --csv --implicit-csv-header join --no-implicit-csv-header -l your-join-in-with-header.csv ... your-headerless.csv`. --quote-all اجبار به نقل‌قول دوتایی (double-quoting) فیلدهای CSV. -N میان‌بری برای صرفه‌جویی در فشردن کلیدها به‌جای `--implicit-csv-header --headerless-csv-output`. .fi .if n \{\ .RE.SH "پرچم‌های ویژه DKVP (DKVP-ONLY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که برای قالب DKVP کاربرد دارند. --incr-key بدون این گزینه، فیلدهای فاقد کلید در DKVP با شماره فیلد کلیدگذاری می‌شوند. برای مثال: `a=10,b=20,30,d=40,50` به‌صورت `$a=10,$b=20,$3=30,$d=40,$5=50` دریافت می‌شود. با این گزینه، آن‌ها با یک شمارنده افزایشی از فیلدهای فاقد کلید کلیدگذاری می‌شوند. برای مثال: `a=10,b=20,30,d=40,50` به‌صورت `$a=10,$b=20,$1=30,$d=40,$2=50` دریافت می‌شود. .fi .if n \{\ .RE .SH "پرچم‌های قالب فایل (FILE-FORMAT FLAGS)" .sp .if n \{\ .RS 0 .\} .nf برای اطلاعات بیشتر درباره قالب‌های فایلی که Miller پشتیبانی می‌کند، به صفحه مستندات File formats یا `mlr help file-formats` مراجعه کنید. مثال‌ها: `--csv` برای ورودی و خروجی با قالب CSV؛ `--icsv --opprint` برای ورودی با قالب CSV و خروجی با چاپ آراسته (pretty-printed). لطفاً به جای `--format1 --oformat2` از `--iformat1 --oformat2` استفاده کنید. حالت دوم پرچم‌های ورودی و خروجی را برای `format1` تنظیم می‌کند که همه آن‌ها در تمام موارد با تنظیم قالب خروجی روی `format2` بازنویسی نمی‌شوند. --asv or --asvlite استفاده از قالب ASV برای داده‌های ورودی و خروجی. --csv or -c or --c2c استفاده از قالب CSV برای داده‌های ورودی و خروجی. --csvlite استفاده از قالب CSV-lite برای داده‌های ورودی و خروجی. --dcf استفاده از قالب فایل کنترل دبیان (DCF) برای داده‌های ورودی و خروجی. --dkvp or --d2d استفاده از قالب DKVP برای داده‌های ورودی و خروجی. --dkvpx استفاده از قالب DKVPX برای داده‌های ورودی و خروجی. --gen-field-name تعیین نام فیلد برای --igen. مقدار پیش‌فرض: "i". --gen-start تعیین مقدار آغازین برای --igen. مقدار پیش‌فرض: 1. --gen-step تعیین مقدار گام برای --igen. مقدار پیش‌فرض: 1. --gen-stop تعیین مقدار پایانی برای --igen. مقدار پیش‌فرض: 100. --iasv or --iasvlite استفاده از قالب ASV برای داده‌های ورودی. --icsv استفاده از قالب CSV برای داده‌های ورودی. --icsvlite استفاده از قالب CSV-lite برای داده‌های ورودی. --idcf استفاده از قالب فایل کنترل دبیان (DCF) برای داده‌های ورودی. --idkvp استفاده از قالب DKVP برای داده‌های ورودی. --igen نادیده گرفتن فایل‌های ورودی و در عوض، تولید ورودی عددی متوالی با مقادیر --gen-field-name ،--gen-start، --gen-step و --gen-stop. همچنین فعل seqgen را ببینید که کاربردی‌تر/شهودی‌تر است. --ijson استفاده از قالب JSON برای داده‌های ورودی. --ijsonl استفاده از قالب JSON Lines برای داده‌های ورودی. --imd or --imarkdown استفاده از قالب جدول مارک‌داون برای داده‌های ورودی. --inidx استفاده از قالب NIDX برای داده‌های ورودی. --io {format name} استفاده از format name برای داده‌های ورودی و خروجی. برای مثال: `--io csv` مانند `--csv` است. --ipprint استفاده از قالب PPRINT برای داده‌های ورودی. --irecutils استفاده از قالب GNU recutils (.rec) برای داده‌های ورودی. --itsv استفاده از قالب TSV برای داده‌های ورودی. --itsvlite استفاده از قالب TSV-lite برای داده‌های ورودی. --iusv or --iusvlite استفاده از قالب USV برای داده‌های ورودی. --ixtab استفاده از قالب XTAB برای داده‌های ورودی. --iyaml استفاده از قالب YAML برای داده‌های ورودی. --json or -j or --j2j استفاده از قالب JSON برای داده‌های ورودی و خروجی. --jsonl or --l2l استفاده از قالب JSON Lines برای داده‌های ورودی و خروجی. --md or --markdown استفاده از قالب جدول مارک‌داون برای داده‌های ورودی و خروجی. --nidx or --n2n استفاده از قالب NIDX برای داده‌های ورودی و خروجی. --oasv or --oasvlite استفاده از قالب ASV برای داده‌های خروجی. --ocsv استفاده از قالب CSV برای داده‌های خروجی. --ocsvlite استفاده از قالب CSV-lite برای داده‌های خروجی. --odcf استفاده از قالب فایل کنترل دبیان (DCF) برای داده‌های خروجی. --odkvp استفاده از قالب DKVP برای داده‌های خروجی. --ojson استفاده از قالب JSON برای داده‌های خروجی. --ojsonl استفاده از قالب JSON Lines برای داده‌های خروجی. --omd or --omarkdown استفاده از قالب جدول مارک‌داون برای داده‌های خروجی. --onidx استفاده از قالب NIDX برای داده‌های خروجی. --opprint استفاده از قالب PPRINT برای داده‌های خروجی. --orecutils استفاده از قالب GNU recutils (.rec) برای داده‌های خروجی. --otsv استفاده از قالب TSV برای داده‌های خروجی. --otsvlite استفاده از قالب TSV-lite برای داده‌های خروجی. --ousv or --ousvlite استفاده از قالب USV برای داده‌های خروجی. --oxtab استفاده از قالب XTAB برای داده‌های خروجی. --oyaml استفاده از قالب YAML برای داده‌های خروجی. --pprint or --p2p استفاده از قالب PPRINT برای داده‌های ورودی و خروجی. --recutils استفاده از قالب GNU recutils (.rec) برای داده‌های ورودی و خروجی. --tsv or -t or --t2t استفاده از قالب TSV برای داده‌های ورودی و خروجی. --tsvlite استفاده از قالب TSV-lite برای داده‌های ورودی و خروجی. --usv or --usvlite استفاده از قالب USV برای داده‌های ورودی و خروجی. --xtab or --x2x استفاده از قالب XTAB برای داده‌های ورودی و خروجی. --xvright راست‌چین کردن مقادیر برای قالب XTAB. --yaml or --y2y استفاده از قالب YAML برای داده‌های ورودی و خروجی. -i {format name} استفاده از format name برای داده‌های ورودی. برای مثال: `-i csv` مانند `--icsv` است. -o {format name} استفاده از format name برای داده‌های خروجی. برای مثال: `-o csv` مانند `--ocsv` است. .fi .if n \{\ .RE .SH "پرچم‌های مسطح‌سازی و عکس آن (FLATTEN-UNFLATTEN FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این پرچم‌ها نحوه تبدیل مقادیر رکورد را که نگاشت (map) یا آرایه (array) هستند توسط Miller کنترل می‌کنند؛ زمانی که ورودی JSON/YAML است و خروجی چنین نیست (مسطح‌سازی - flattening) یا ورودی JSON/YAML نیست و خروجی JSON/YAML است (عکس مسطح‌سازی - unflattening). برای اطلاعات بیشتر به صفحه مستندات flatten/unflatten در آدرس https://miller.readthedocs.io/en/latest/flatten-unflatten مراجعه کنید. --flatsep or --jflatsep {string} جداکننده برای مسطح‌سازی کلیدهای چندسطحی JSON؛ برای مثال: `{"a":{"b":3}}` در قالب‌های غیر JSON به `a:b => 3` تبدیل می‌شود. مقدار پیش‌فرض `.` است. --no-auto-flatten هنگامی که خروجی JSON یا YAML نیست، رفتار پیش‌فرض مسطح‌سازی خودکار را لغو می‌کند. پیش‌فرض: اگر `$y = [7,8,9]` باشد، به `y.1=7,y.2=8,y.3=9` مسطح می‌شود و برای نگاشت‌ها نیز به همین صورت است. با `--no-auto-flatten`، در عوض `$y=[1, 2, 3]` حاصل می‌شود. --no-auto-unflatten هنگامی که ورودی JSON یا YAML نیست و خروجی JSON یا YAML است، رفتار پیش‌فرض معکوس‌سازی مسطح‌سازی خودکار را لغو می‌کند. پیش‌فرض: اگر ورودی شامل `y.1=7,y.2=8,y.3=9` باشد، به `$y=[7,8,9]` برگردانده می‌شود. با `--no-auto-flatten`، در عوض `${y.1}=7,${y.2}=8,${y.3}=9` حاصل می‌شود. .fi .if n \{\ .RE.SH "پرچم‌های میان‌بُر تبدیل قالب (FORMAT-CONVERSION KEYSTROKE-SAVER FLAGS)" .sp .if n \{\ .RS 0 .\} .nf به عنوان میان‌بُر برای تبدیل قالب می‌توانید از موارد زیر استفاده کنید. حروف c، t، j، l، d، n، x، p، m و y به ترتیب به قالب‌های CSV، TSV، JSON، JSON Lines، DKVP، NIDX، XTAB، PPRINT، markdown و YAML اشاره دارند. قالب DCF نیز پشتیبانی می‌شود (از --dcf برای ورودی و خروجی DCF استفاده کنید). قالب GNU recutils نیز پشتیبانی می‌شود (از --recutils برای ورودی و خروجی recutils استفاده کنید). | In\eout | CSV | TSV | JSON | JSONL | DKVP | NIDX | XTAB | PPRINT | Markdown | YAML | +----------+----------+----------+----------+-------+-------+-------+-------+--------+----------+--------+ | CSV | --c2c,-c | --c2t | --c2j | --c2l | --c2d | --c2n | --c2x | --c2p | --c2m | --c2y | | TSV | --t2c | --t2t,-t | --t2j | --t2l | --t2d | --t2n | --t2x | --t2p | --t2m | --t2y | | JSON | --j2c | --j2t | --j2j,-j | --j2l | --j2d | --j2n | --j2x | --j2p | --j2m | --j2y | | JSONL | --l2c | --l2t | --l2j | --l2l | --l2d | --l2n | --l2x | --l2p | --l2m | --l2y | | DKVP | --d2c | --d2t | --d2j | --d2l | --d2d | --d2n | --d2x | --d2p | --d2m | --d2y | | NIDX | --n2c | --n2t | --n2j | --n2l | --n2d | --n2n | --n2x | --n2p | --n2m | --n2y | | XTAB | --x2c | --x2t | --x2j | --x2l | --x2d | --x2n | --x2x | --x2p | --x2m | --x2y | | PPRINT | --p2c | --p2t | --p2j | --p2l | --p2d | --p2n | --p2x | -p2p | --p2m | --p2y | | Markdown | --m2c | --m2t | --m2j | --m2l | --m2d | --m2n | --m2x | --m2p | | --m2y | | YAML | --y2c | --y2t | --y2j | --y2l | --y2d | --y2n | --y2x | --y2p | --y2m | --y2y | -p میان‌بُری برای `--nidx --fs space --repifs`. -T میان‌بُری برای `--nidx --fs tab`. .fi .if n \{\ .RE .SH "پرچم‌های ویژه JSON (JSON-ONLY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که برای قالب خروجی JSON کاربرد دارند. --jlistwrap or --jl قرار دادن خروجی JSON در بیرونی‌ترین `[ ]`. این حالت پیش‌فرض برای قالب خروجی JSON است. --jvquoteall تبدیل اجباری تمام مقادیر JSON -- به صورت بازگشتی در فهرست‌ها و شیءها -- به رشته (string). --jvstack قرار دادن یک جفت کلید-مقدار در هر خط برای خروجی JSON (خروجی چندخطی). این حالت پیش‌فرض برای قالب خروجی JSON است. --no-jlistwrap خروجی JSON در بیرونی‌ترین `[ ]` قرار نمی‌گیرد. این حالت پیش‌فرض برای قالب خروجی JSON Lines است. --no-jvstack قرار دادن همه شیءها/آرایه‌ها در یک خط برای خروجی JSON. این حالت پیش‌فرض برای قالب خروجی JSON Lines است. --no-yarray خروجی YAML را در یک سند آرایه‌ای واحد قرار نمی‌دهد؛ به ازای هر رکورد یک سند YAML با `---` در میان آن‌ها تولید می‌کند. --yarray or --ya قرار دادن خروجی YAML در یک سند آرایه‌ای سطح بالا (top-level). این حالت پیش‌فرض برای قالب خروجی YAML است. .fi .if n \{\ .RE .SH "پرچم‌های منسوخ‌شده (LEGACY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که در نسخه فعلی Miller کاری انجام نمی‌دهند. آن‌ها به عنوان پرچم‌های بی‌اثر (no-op) پذیرفته می‌شوند تا از خراب شدن اسکریپت‌های قدیمی جلوگیری شود. --jknquoteint اطلاعات نوع داده از فایل‌های ورودی JSON اکنون در طول جریان پردازش حفظ می‌شود. --jquoteall اطلاعات نوع داده از فایل‌های ورودی JSON اکنون در طول جریان پردازش حفظ می‌شود. --json-fatal-arrays-on-input برنامه Miller اکنون از نسخه ۶ از آرایه‌ها پشتیبانی می‌کند. --json-map-arrays-on-input برنامه Miller اکنون از نسخه ۶ از آرایه‌ها پشتیبانی می‌کند. --json-skip-arrays-on-input برنامه Miller اکنون از نسخه ۶ از آرایه‌ها پشتیبانی می‌کند. --jsonx پرچم `--jvstack` اکنون در Miller 6 به صورت پیش‌فرض فعال است. --mmap برنامه Miller دیگر برای دسترسی به فایل‌های داده از نگاشت حافظه (memory-mapping) استفاده نمی‌کند. --no-mmap برنامه Miller دیگر برای دسترسی به فایل‌های داده از نگاشت حافظه (memory-mapping) استفاده نمی‌کند. --ojsonx پرچم `--jvstack` اکنون در Miller 6 به صورت پیش‌فرض فعال است. --quote-minimal از نسخه ۶ نادیده گرفته می‌شود. انواع داده اکنون در طول جریان پردازش استنتاج و حفظ می‌شوند. --quote-none از نسخه ۶ نادیده گرفته می‌شود. انواع داده اکنون در طول جریان پردازش استنتاج و حفظ می‌شوند. --quote-numeric از نسخه ۶ نادیده گرفته می‌شود. انواع داده اکنون در طول جریان پردازش استنتاج و حفظ می‌شوند. --quote-original از نسخه ۶ نادیده گرفته می‌شود. انواع داده اکنون در طول جریان پردازش استنتاج و حفظ می‌شوند. --vflatsep از نسخه ۶ نادیده گرفته می‌شود. این قابلیت در قالب‌بندی JSON ادغام شده است. .fi .if n \{\ .RE .SH "پرچم‌های ویژه MARKDOWN (MARKDOWN-ONLY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که برای قالب جدولی markdown کاربرد دارند. --md-aligned or --markdown-aligned استفاده از قالب جدولی markdown برای داده‌های ورودی و خروجی، با ستون‌های چپ‌چین و فاصله‌گذاری‌شده (padded). به معنای --md نیز هست، بنابراین نیازی به ارسال --md ندارید. --omd-aligned or --omarkdown-aligned برای خروجی جدولی markdown، خانه‌ها را چپ‌چین کرده و به هر ستون فاصله‌ای یکدست می‌دهد تا متن خام markdown خواناتر شده و نگهداری آن آسان‌تر باشد. (جدول نمایش‌یافته تغییری نمی‌کند.) به معنای --omd نیز هست، بنابراین نیازی به ارسال --omd ندارید. .fi .if n \{\ .RE .SH "پرچم‌های متفرقه (MISCELLANEOUS FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که در هیچ دسته‌بندی دیگری جای نمی‌گیرند. --errors-json ارسال خطاهای تجزیه به صورت یک شیء JSON به stderr به جای پیام متنی ساده. برای عامل‌های هوش مصنوعی و اسکریپت‌هایی در نظر گرفته شده که بر اساس نوع خطا تصمیم‌گیری می‌کنند نه با تطبیق عبارات منظم روی متن پیام. معادل با مقداردهی متغیر محیطی `MLR_ERRORS_JSON` به یک مقدار درست (truthy). --fflush اجبار به نوشتن خروجی بافرشده پس از هر رکورد خروجی. حالت پیش‌فرض تخلیه خروجی پس از هر رکورد است اگر خروجی به ترمینال باشد، یا با بسامد کمتر اگر خروجی به یک فایل یا لوله (pipe) باشد. حالت پیش‌فرض یک بهینه‌سازی کارایی چشمگیر برای فایل‌های بزرگ است. از این پرچم برای اجبار به به‌روزرسانی‌های مکرر حتی زمانی که خروجی به لوله یا فایل است، با هزینه افت کارایی استفاده کنید. --files {filename} تعیین فایلی که خودش در هر خط، نام فایل‌های ورودی را دربر دارد. می‌تواند بیش از یک بار استفاده شود. --from {filename} تعیین یک فایل ورودی پیش از فعل(ها)، به جای قرار گرفتن پس از آن‌ها. می‌تواند بیش از یک بار استفاده شود. مثال: `mlr --from a.dat --from b.dat cat` معادل با `mlr cat a.dat b.dat` است. --hash-records این یک پارامتر داخلی است که معمولاً نیازی به تغییر آن نیست. مکانیزمی را کنترل می‌کند که Miller از طریق آن به فیلدهای درون رکوردها دسترسی پیدا می‌کند. به طور کلی --no-hash-records سریع‌تر بوده و حالت پیش‌فرض است. برای موارد استفاده خاص شامل داده‌هایی با فیلدهای بسیار زیاد، که تعداد زیادی از آن‌ها در طول یک دور پردازش مورد استفاده قرار می‌گیرند، --hash-records ممکن است مزیت جزئی در کارایی داشته باشد. --infer-int-as-float or -A تبدیل تمام اعداد صحیح در فایل‌های داده به اعداد اعشاری (float). --infer-none or -S با مقادیری مانند 123 یا 456.7 در فایل‌های داده به عنوان int/float رفتار نکن؛ آن‌ها را به عنوان رشته رها کن. --infer-octal or -O در نظر گرفتن اعدادی مانند 0123 در فایل‌های داده به صورت عددی؛ پیش‌فرض رشته است. توجه داشته باشید که 00--07 و غیره به عنوان int و 08-09 به عنوان float خوانده می‌شوند. --load {filename} بارگذاری فایل اسکریپت DSL برای تمام عملیات‌های put/filter در خط فرمان. اگر نام پس از `--load` یک دایرکتوری باشد، تمام فایل‌های `*.mlr` در آن دایرکتوری بارگذاری می‌شوند. این دقیقاً مانند `put -f` و `filter -f` است، با این تفاوت که در ابتدای خط فرمان می‌آید، بنابراین در صورت تمایل می‌توانید کارهایی مانند `alias mlr='mlr --load ~/myscripts'` انجام دهید. --mfrom {filenames} تعیین یک یا چند فایل ورودی پیش از فعل(ها)، به جای قرار گرفتن پس از آن‌ها. می‌تواند بیش از یک بار استفاده شود. فهرست نام فایل‌ها باید به `--` ختم شود. این قابلیت از این جهت مفید است که برای مثال `--from *.csv` کاری را که انتظار دارید انجام نمی‌دهد اما `--mfrom *.csv --` انجام می‌دهد. --mload {filenames} مانند `--load` اما با بیش از یک نام فایل کار می‌کند، مانند `--mload *.mlr --`. --no-dedupe-field-names به طور پیش‌فرض، اگر یک رکورد ورودی دارای فیلدی با نام `x` و فیلد دیگری نیز با نام `x` باشد، فیلد دوم به `x_2` تغییر نام می‌یابد و به همین ترتیب. با ارائه این پرچم، مقدار `x` دوم جایگزین مقدار `x` اول در زمان خواندن رکورد خواهد شد. این پرچم تأثیری بر رکوردهای ورودی JSON ندارد، چرا که در آن‌ها کلیدهای تکراری همواره باعث حفظ مقدار آخرین کلید می‌شوند. --no-fflush اجازه می‌دهد خروجی بافرشده پس از هر رکورد خروجی نوشته نشود. حالت پیش‌فرض تخلیه خروجی پس از هر رکورد است اگر خروجی به ترمینال باشد، یا با بسامد کمتر اگر خروجی به یک فایل یا لوله باشد. حالت پیش‌فرض یک بهینه‌سازی کارایی چشمگیر برای فایل‌های بزرگ است. از این پرچم برای امکان به‌روزرسانی‌های کمتر در زمان ارسال خروجی به ترمینال استفاده کنید. بعید است این مورد بهبود کارایی محسوسی ایجاد کند، چرا که خروجی مستقیم روی صفحه برای فایل‌های بزرگ سربار خاص خود را دارد. --no-hash-records مشاهده کنید: --hash-records. --no-shell غیرفعال کردن قابلیت Miller در اجرای دستورات خارجی: توابع `system` و `exec` در DSL، تغییر مسیرهای لوله‌ای مانند `tee | "command"`، و `--prepipe`/`--prepipex` همگی به جای اجرا شدن، بدون خطا شکست می‌خورند (fail cleanly). معادل با مقداردهی متغیر محیطی `MLR_NO_SHELL` به یک مقدار درست (truthy). برای اجرای خطوط فرمان ساخته‌شده توسط عامل‌ها (مثلاً از طریق `mlr mcp`) بدون اعطای دسترسی به اجرای دستورات دلخواه در نظر گرفته شده است. پس از غیرفعال‌سازی، دسترسی به شل برای ادامه اجرای فرایند نمی‌تواند مجدداً فعال شود. --norc بارگذاری نکردن فایل .mlrrc. --nr-progress-mod {m} با m به عنوان یک عدد صحیح مثبت: چاپ نام فایل و تعداد رکوردها در os.Stderr به ازای هر m رکورد ورودی. --ofmt {format} مانند `%.18f`، `%.0f`، `%9.6e`. لطفاً از کدهای شبیه sprintf (https://pkg.go.dev/fmt) برای اعداد ممیز شناور استفاده کنید. در صورت عدم تعیین، قالب‌بندی پیش‌فرض استفاده می‌شود. همچنین تابع `fmtnum` و فعل `format-values` را ببینید. --ofmte {n} استفاده از --ofmte 6 به عنوان کوته‌نوشت --ofmt %.6e، و غیره. --ofmtf {n} استفاده از --ofmtf 6 به عنوان کوته‌نوشت --ofmt %.6f، و غیره. --ofmtg {n} استفاده از --ofmtg 6 به عنوان کوته‌نوشت --ofmt %.6g، و غیره. --profile or -P {name} اعمال تنظیمات از بخش [name] فایل .mlrrc، پس از هرگونه تنظیمات سراسری (پیش از بخش‌ها). اگر چنین بخشی در هیچ فایل .mlrrc پردازش‌شده‌ای وجود نداشته باشد، خطا است. برای اطلاعات بیشتر لطفاً ببینید: https://miller.readthedocs.io/en/latest/customization --records-per-batch {n} این یک پارامتر داخلی برای بیشترین تعداد رکوردها در یک بسته (batch) است. معمولاً نیازی به تغییر آن نیست، مگر زمانی که ورودی از `tail -f` باشد. همچنین ببینید: https://miller.readthedocs.io/en/latest/reference-main-flag-list --s-no-comment-strip {file name} دریافت پرچم‌های خط فرمان از نام فایل، مانند -s، اما بدون حذف کامنت‌ها. برای اطلاعات بیشتر لطفاً ببینید: https://miller.readthedocs.io/en/latest/scripting --seed {n} با `n` به شکل `12345678` یا `0xcafefeed`. برای توابع `urand`، `urandint`، و `urand32` در `put`/`filter`. --tz {timezone} تعیین منطقه زمانی، که متغیر محیطی `$TZ` (در صورت وجود) را بازنویسی می‌کند. -I پردازش درجا (in-place) فایل‌ها. برای هر نام فایل در خط فرمان، خروجی در یک فایل موقت در همان دایرکتوری نوشته می‌شود که سپس روی فایل اصلی جایگزین می‌گردد. هر فایل به طور مستقل پردازش می‌شود: اگر قالب خروجی CSV باشد، سرایندهای CSV در هر فایل خروجی حاضر خواهند بود، آمارها تنها روی رکوردهای همان فایل محاسبه می‌شوند؛ و غیره. -n هیچ فایل ورودی و ورودی استانداردی پردازش نمی‌شود. تنها برای `mlr put` همراه با عبارت‌های `begin`/`end` کاربرد دارد. (مشابه با `--from /dev/null`.) همچنین در `mlr -n put -v '...'` برای تحلیل درخت‌های نحو انتزاعی مفید است (در صورت تمایل). -s {file name} دریافت پرچم‌های خط فرمان از نام فایل. برای اطلاعات بیشتر لطفاً ببینید: https://miller.readthedocs.io/en/latest/scripting -x اگر رکوردی حاوی مقدار خطا باشد، آن را گزارش کرده و پردازش را متوقف کن. حالت پیش‌فرض، چاپ مقدار فیلد به صورت `(error)` و ادامه دادن است. .fi .if n \{\ .RE.SH "پرچم‌های رنگ‌آمیزی خروجی (OUTPUT-COLORIZATION FLAGS)" .sp .if n \{\ .RS 0 .\} .nf ‏Miller از رنگ‌ها برای برجسته‌سازی خروجی‌ها استفاده می‌کند. می‌توانید اولویت‌های رنگی را مشخص کنید. نکته: رنگ‌آمیزی خروجی در Windows کار نمی‌کند. موارد دارای رنگ: * کلیدها در خطوط سرآیند CSV، کلیدهای JSON و غیره * مقادیر در خطوط داده‌های CSV، مقادیر اسکالر JSON و غیره در خروجی regression-test * برخی از رشته‌های راهنمای برخط (online-help) قوانین رنگ‌آمیزی: * به‌طور پیش‌فرض، خروجی تنها در صورتی رنگ‌آمیزی می‌شود که در stdout نوشته شود و stdout یک TTY باشد. * مثال: رنگی: `mlr --csv cat foo.csv` * مثال: بدون رنگ: `mlr --csv cat foo.csv > bar.csv` * مثال: بدون رنگ: `mlr --csv cat foo.csv | less` * رنگ‌های پیش‌فرض به این دلیل انتخاب شده‌اند که با پس‌زمینهٔ سیاه یا سفید ترمینال مناسب به نظر می‌رسند و برای انواع متداول دید رنگی انسان قابل تشخیص هستند. سازوکارهای رنگ‌آمیزی: * ‏Miller تنها از دنباله‌های گریز ANSI استفاده می‌کند. این ویژگی در Windows به جز در محیط Cygwin کار نمی‌کند. * نیازمند این است که متغیر محیطی `TERM` روی یک رشتهٔ غیرخالی تنظیم شده باشد. * برای بررسی اینکه آیا ترمینال از ANSI ۲۵۶‌رنگ یا ANSI ۱۶‌رنگ پشتیبانی می‌کند تلاشی انجام نمی‌دهد. توجه داشته باشید اگر رنگ‌ها در محدودهٔ 0..15 باشند، دنباله‌های گریز ANSI ۱۶‌رنگ استفاده می‌شوند، بنابراین این موضوع در کنترل کاربر است. نحوهٔ کنترل رنگ‌آمیزی توسط شما: * غیرفعال‌سازی/فعال‌سازی: * متغیر محیطی `export MLR_NO_COLOR=true` یا `export NO_COLOR=true` به معنای عدم رنگ‌آمیزی است، حتی اگر خروجی stdout+TTY باشد. * متغیر محیطی `export MLR_ALWAYS_COLOR=true` به معنای رنگ‌آمیزی است، حتی اگر stdout+TTY نباشد. به‌عنوان مثال، ممکن است بخواهید هنگام ارسال خروجی mlr با لوله (pipe) به `less -r` از این متغیر استفاده کنید. * پرچم‌های خط فرمان: `--no-color` یا `-M`، و `--always-color` یا `-C`. * انتخاب رنگ را می‌توان با استفاده از متغیرهای محیطی یا پرچم‌های خط فرمان، با مقادیر 0..255 مشخص کرد: * `export MLR_KEY_COLOR=208`، `MLR_VALUE_COLOR=33` و غیره: `MLR_KEY_COLOR` `MLR_VALUE_COLOR` `MLR_PASS_COLOR` `MLR_FAIL_COLOR` `MLR_REPL_PS1_COLOR` `MLR_REPL_PS2_COLOR` `MLR_HELP_COLOR` * پرچم‌های خط فرمان `--key-color 208`، `--value-color 33` و غیره: `--key-color` `--value-color` `--pass-color` `--fail-color` `--repl-ps1-color` `--repl-ps2-color` `--help-color` * این امکان به‌ویژه زمانی مفید است که رنگ پس‌زمینهٔ ترمینال شما با تنظیمات فعلی تداخل داشته باشد. اگر هم تنظیمات متغیرهای محیطی و هم پرچم‌های خط فرمان ارائه شوند، پرچم‌های خط فرمان اولویت دارند. رنگ‌ها را می‌توان با استفاده از نام‌هایی مانند "red" یا "orchid" مشخص کرد: لطفاً برای مشاهدهٔ نام‌های موجود، `mlr --list-color-names` را ببینید. همچنین می‌توان آن‌ها را با استفاده از اعداد در محدودهٔ 0..255 مانند 170 مشخص کرد: لطفاً `mlr --list-color-codes` را ببینید. همچنین می‌توانید از "bold"، "underline" و/یا "reverse" استفاده کنید. علاوه‌بر این، ترکیب‌هایی از این موارد را می‌توان با یک "-" متصل کرد، مانند "red-bold"، "bold-170"، "bold-underline" و غیره. --always-color یا -C به Miller دستور می‌دهد خروجی را حتی در شرایطی که به‌طور معمول رنگ‌آمیزی نمی‌شد، رنگ‌آمیزی کند. برای هدایت خروجی با لوله به `less -r` کاربرد دارد. --fail-color تعیین رنگ (ببینید: `--list-color-codes` و `--list-color-names`) برای موارد ناموفق در `mlr regtest`. --help-color تعیین رنگ (ببینید: `--list-color-codes` و `--list-color-names`) برای بخش‌های برجسته در خروجی `mlr help`. --key-color تعیین رنگ (ببینید: `--list-color-codes` و `--list-color-names`) برای کلیدهای رکورد. --list-color-codes نمایش کدهای رنگ موجود در محدودهٔ 0..255، مانند 170 به‌عنوان مثال. --list-color-names نمایش نام‌های کدهای رنگ موجود، مانند `orchid` به‌عنوان مثال. --no-color یا -M به Miller دستور می‌دهد که هیچ خروجی‌ای را رنگ‌آمیزی نکند. --pass-color تعیین رنگ (ببینید: `--list-color-codes` و `--list-color-names`) برای موارد موفق در `mlr regtest`. --value-color تعیین رنگ (ببینید: `--list-color-codes` و `--list-color-names`) برای مقادیر رکورد. .fi .if n \{\ .RE .SH "پرچم‌های ویژهٔ PPRINT (PPRINT-ONLY FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی هستند که برای قالب PPRINT قابل اعمال می‌باشند. --barred یا --barred-output چاپ حاشیه (border) به دور خروجی PPRINT. --barred-input هنگامی که همراه با --pprint استفاده شود، ورودی حاشیه‌دار را می‌پذیرد. --barred-unicode استفاده از نویسه‌های یونیکد برای خروجی حاشیه‌دار. --fixed {string} مشخص‌سازی عرض ثابت. یکی از موارد: 'widths:,,...'، left-align، left-align-multi-word، right-align، right-align-multi-word --fw {string} میان‌بری برای --fixed left-align-multi-word --right راست‌چین کردن تمام فیلدها برای خروجی PPRINT. --right-align-numeric راست‌چین کردن فیلدهای با مقادیر عددی برای خروجی PPRINT، در حالی که سایر فیلدها چپ‌چین باقی می‌مانند. سرآیندها بر روی ستون‌هایی که مقادیرشان کاملاً عددی است راست‌چین می‌شوند تا سرآیند و داده‌ها تراز یکسانی داشته باشند. همچنین در خروجی markdown نیز اعمال می‌شود، جایی که ستون‌های عددی نشانگرهای راست‌چین (`---:`) در خط جداکنندهٔ سرآیند دریافت می‌کنند. .fi .if n \{\ .RE .SH "پرچم‌های پروفایل‌سازی (PROFILING FLAGS)" .sp .if n \{\ .RS 0 .\} .nf این‌ها پرچم‌هایی برای پروفایل‌سازی کارایی Miller هستند. --cpuprofile {CPU-profile file name} ایجاد یک فایل CPU-profile برای تحلیل کارایی. دستورالعمل‌ها در stderr چاپ خواهند شد. این پرچم باید دقیقاً اولین مورد پس از 'mlr' در خط فرمان باشد. --time چاپ مدت زمان سپری‌شدهٔ اجرا به ثانیه در stderr در پایان اجرای برنامه. --traceprofile ایجاد یک فایل trace-profile برای تحلیل کارایی. دستورالعمل‌ها در stderr چاپ خواهند شد. این پرچم باید دقیقاً اولین مورد پس از 'mlr' در خط فرمان باشد. .fi .if n \{\ .RE.SH "پرچم‌های جداکننده (SEPARATOR FLAGS)" .sp .if n \{\ .RS 0 .\} .nf برای اطلاعات بیشتر درباره جداکننده‌های رکورد، جداکننده‌های فیلد، و جداکننده‌های جفت، صفحه مستندات Separators را ببینید. همچنین صفحه مستندات File formats یا دستور `mlr help file-formats` را برای اطلاعات بیشتر درباره قالب‌های پشتیبانی‌شده در Miller بررسی کنید. به‌طور خلاصه: * برای رکوردهای DKVP مانند `x=1,y=2,z=3`، فیلدها با کاما از هم جدا می‌شوند، جفت‌های کلید\-مقدار با کاما جدا می‌شوند، و هر رکورد با یک خط جدید (newline) از رکورد بعدی تفکیک می‌گردد. * هر قالب فایل جداکننده‌های پیش‌فرض خود را دارد. * بیشتر قالب‌ها، مانند CSV، از جداکننده‌های جفت پشتیبانی نمی‌کنند: کلیدها در سطر سربرگ CSV و مقادیر در هر سطر دادهٔ CSV قرار دارند؛ کلیدها و مقادیر در کنار یکدیگر قرار نمی‌گیرند. * برخی جداکننده‌ها قابل برنامه‌ریزی نیستند: برای مثال JSON از دونقطه (colon) به عنوان جداکنندهٔ جفت استفاده می‌کند اما این مورد در مشخصات JSON غیرقابل تغییر است. * می‌توانید جداکننده‌ها را بین ورودی و خروجی Miller به‌طور متفاوتی تنظیم کنید -- از این رو گزینه‌های `--ifs` و `--ofs` و غیره وجود دارند. نکاتی درباره پایانه‌های سطر: * پایانه‌های سطر پیش‌فرض (`--irs` و `--ors`) خط جدید (newline) هستند که به معنای پذیرش فایل‌های دارای carriage-return/newline (مانند ویندوز) برای ورودی، و تولید پایانه‌های سطر مناسب با پلتفرم در خروجی تفسیر می‌شود. * برای خروجی‌های CSV ،CSV-lite ،TSV و TSV-lite، مقدار ORS می‌تواند خط جدید (پیش‌فرض) یا carriage-return/newline باشد: مانند `--ors crlf` یا `--ors '\er\en'` برای پایانه‌های سطر به سبک RFC-4180 روی هر پلتفرمی. نکاتی درباره سایر جداکننده‌ها: * مقادیر IPS/OPS تنها برای قالب‌های DKVP و XTAB استفاده می‌شوند، زیرا فقط در این قالب‌ها جفت‌های کلید\-مقدار در کنار یکدیگر ظاهر می‌شوند. * مقادیر IRS/ORS برای قالب XTAB نادیده گرفته می‌شوند. اسماً IFS و OFS خط جدید هستند؛ رکوردهای XTAB با دو یا چند IFS/OFS متوالی -- یعنی یک سطر خالی -- از هم جدا می‌شوند. تمام موارد ذکر شده در بالا درباره `--irs/--ors/--rs auto`، برای قالب XTAB تبدیل به `--ifs/--ofs/--fs auto` می‌شود. (مقادیر پیش‌فرض IFS/OFS برای XTAB برابر "auto" است.) * مقدار OFS باید برای قالب PPRINT تک‌نویسه‌ای باشد. زیرا با تکرار شدن برای تراز کردن استفاده می‌شود؛ جداکننده‌های چندنویسه‌ای تراز کردن را غیرممکن می‌سازند. * مقدار OPS می‌تواند برای قالب XTAB چندنویسه‌ای باشد، که در این صورت تراز کردن غیرفعال می‌شود. * مقادیر FS/PS برای قالب markdown نادیده گرفته می‌شوند؛ از RS استفاده می‌شود. * تمام گزینه‌های FS و PS برای قالب JSON نادیده گرفته می‌شوند، زیرا ارتباطی با قالب JSON ندارند. * می‌توانید جداکننده‌ها را به هر یک از روش‌های زیر، که با مثال نشان داده شده است، مشخص کنید: - آن‌ها را تایپ کنید، و در صورت نیاز برای گریز در شل نقل‌قول بگذارید، مانند: `--fs '|' --ips :` - توالی‌های گریز سبک C، مانند `--rs '\er\en' --fs '\et'`. - برای اجتناب از اسلش معکوس، می‌توانید از هر یک از نام‌های زیر استفاده کنید: ascii_esc = "\ex1b" ascii_etx = "\ex03" ascii_fs = "\ex1c" ascii_gs = "\ex1d" ascii_null = "\ex00" ascii_rs = "\ex1e" ascii_soh = "\ex01" ascii_stx = "\ex02" ascii_us = "\ex1f" asv_fs = "\ex1f" asv_rs = "\ex1e" colon = ":" comma = "," cr = "\er" crcr = "\er\er" crlf = "\er\en" crlfcrlf = "\er\en\er\en" equals = "=" lf = "\en" lflf = "\en\en" newline = "\en" pipe = "|" semicolon = ";" slash = "/" space = " " tab = "\et" usv_fs = "\exe2\ex90\ex9f" usv_rs = "\exe2\ex90\ex9e" - به‌طور مشابه، می‌توانید از موارد زیر برای `--ifs-regex` و `--ips-regex` استفاده کنید: spaces = "( )+" tabs = "(\et)+" whitespace = "([ \et])+" * جداکننده‌های پیش‌فرض بر اساس قالب: Format FS PS RS csv "," N/A "\en" csvlite "," N/A "\en" dcf N/A N/A N/A dkvp "," "=" "\en" dkvpx "," "=" "\en" gen "," N/A "\en" json N/A N/A N/A markdown " " N/A "\en" nidx " " N/A "\en" pprint " " N/A "\en" recutils N/A N/A N/A tsv " " N/A "\en" xtab "\en" " " "\en\en" yaml N/A N/A N/A --fs {string} تعیین FS برای ورودی و خروجی. --ifs {string} تعیین FS برای ورودی. --ifs-regex {string} تعیین FS برای ورودی به‌عنوان یک عبارت منظم. --ips {string} تعیین PS برای ورودی. --ips-regex {string} تعیین PS برای ورودی به‌عنوان یک عبارت منظم. --irs {string} تعیین RS برای ورودی. --ofs {string} تعیین FS برای خروجی. --ops {string} تعیین PS برای خروجی. --ors {string} تعیین RS برای خروجی. --ps {string} تعیین PS برای ورودی و خروجی. --repifs اجازه به تکرار IFS: مثلاً برای تفکیک بر اساس فاصله‌های متوالی. --rs {string} تعیین RS برای ورودی و خروجی. .fi .if n \{\ .RE.SH "دستورهای کمکی (AUXILIARY COMMANDS)" .if n \{\ .RS 0 .\} .nf ورودی‌های موجود: mlr aux-list mlr hex mlr lecat mlr termcvt mlr unhex برای اطلاعات بیشتر، لطفاً دستور mlr {subcommand} --help را فراخوانی کنید. .fi .if n \{\ .RE .SH "پیکربندی MLRRC (MLRRC)" .if n \{\ .RS 0 .\} .nf شما می‌توانید پیش‌فرض‌های شخصی را از طریق $HOME/.mlrrc یا ./.mlrrc (یا هر دو) تنظیم کنید. برای نمونه، اگر معمولاً CSV پردازش می‌کنید، می‌توانید "--csv" را در فایل .mlrrc خود قرار دهید و این قالب پیش‌فرض ورودی/خروجی خواهد بود، مگر آنکه در خط فرمان طور دیگری مشخص شود. قالب فایل .mlrrc به‌صورت یک "--flag" یا "--option value" در هر سطر است، که پیشوند "--" اختیاری است. کامنت‌های با علامت هش (#) و خطوط خالی نادیده گرفته می‌شوند. نمونه .mlrrc: # قالب‌های ورودی و خروجی به‌طور پیش‌فرض CSV هستند (مگر اینکه طور دیگری # در خط فرمان mlr مشخص شده باشد): csv # این‌ها برای CSV بی‌اثرند، اما وقتی از خروجی JSON استفاده می‌کنم، می‌خواهم این # گزینه‌های زیباسازی (pretty-printing) به کار گرفته شوند: jvstack jlistwrap نحوه تعیین مکان .mlrrc: * اگر $MLRRC تنظیم شده باشد: o اگر مقدار آن "__none__" باشد، هیچ فایل .mlrrc پردازش نمی‌شود. o در غیر این صورت، مقدار آن (به‌عنوان یک نام فایل) بارگذاری و پردازش می‌شود. اگر خطاهای نحوی وجود داشته باشد، اجرای mlr متوقف شده و پیام راهنما نمایش داده می‌شود (گویی چیزی را در خط فرمان اشتباه تایپ کرده‌اید). با این حال اگر فایل اصلاً قابل بارگذاری نباشد، نادیده گرفته می‌شود. o هرگاه $MLRRC در محیط تنظیم شده باشد، هر فایل .mlrrc در پوشه خانگی یا پوشه جاری نادیده گرفته می‌شود. * در غیر این صورت: o اگر $HOME/.mlrrc وجود داشته باشد، مطابق بالا پردازش می‌شود. o اگر ./.mlrrc وجود داشته باشد، آن نیز مطابق بالا پردازش می‌شود. (یعنی پیش‌فرض‌های .mlrrc پوشه جاری بر روی پیش‌فرض‌های .mlrrc پوشه خانگی اعمال می‌شوند.) * فلگ خط فرمان "--norc" می‌تواند برای جلوگیری از بارگذاری فایل .mlrrc استفاده شود، حتی زمانی که سایر شرایط برقرار باشد. همچنین ببینید: https://miller.readthedocs.io/en/latest/customization.html .fi .if n \{\ .RE .SH "محیط تعاملی (REPL)" .if n \{\ .RS 0 .\} .nf کاربرد: mlr repl [گزینه‌ها] {صفر یا چند نام فایل داده} -v چاپ درخت نحو انتزاعی (AST) عبارت‌ها در stdout؛ که شفافیت کاملی از قواعد اولویت و شرکت‌پذیری گرامر Miller ارائه می‌دهد. -d مانند -v اما از قالب عبارت‌های پرانتزدار برای AST استفاده می‌کند. -D مانند -d اما با خروجی همگی در یک خط. -w نمایش هشدارها درباره متغیرهای مقداردهی‌نشده -q عدم نمایش بنر راه‌اندازی -s عدم نمایش اعلان‌ها (prompts) --load {DSL script file} بارگذاری فایل اسکریپت قبل از نمایش اعلان خط فرمان. اگر نام پس از --load یک پوشه باشد، تمام فایل‌های "*.mlr" در آن پوشه بارگذاری می‌شوند. --mload {DSL script files} -- مانند --load اما برای کار با بیش از یک نام فایل، مانند '--mload *.mlr --'. -h|--help نمایش این پیام. یا هر کدام از گزینه‌های خواندن/نوشتن مانند --icsv، --ojson و غیره مانند خط فرمان اصلی Miller. هر نام فایل داده دقیقاً همان‌گونه باز می‌شود که گویی صبر کرده و :open {filenames} را در خط فرمان Miller REPL تایپ کرده باشید. .fi .if n \{\ .RE .SH "فعل‌ها (VERBS)" .sp .SS "altkv" .if n \{\ .RS 0 .\} .nf کاربرد: mlr altkv [گزینه‌ها] با دریافت فیلدهایی با مقادیری به فرم a,b,c,d,e,f جفت‌های a=b,c=d,e=f را تولید می‌کند. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "bar" .if n \{\ .RS 0 .\} .nf کاربرد: mlr bar [گزینه‌ها] یک فیلد عددی را با تعدادی ستاره جایگزین می‌کند، که رسم نمودارهای میله‌ای ساده را ممکن می‌سازد. این‌ها با قالب‌های خروجی --opprint یا --oxtab به بهترین شکل هماهنگ می‌شوند. گزینه‌ها: -f {a,b,c} نام فیلدها برای تبدیل به میله. --lo {lo} مقدار حد پایین برای حداقل پهنای میله: پیش‌فرض '0.000000'. --hi {hi} مقدار حد بالا برای حداکثر پهنای میله: پیش‌فرض '100.000000'. -w {n} پهنای فیلد میله: پیش‌فرض '40'. --auto محاسبه خودکار محدوده‌ها با نادیده گرفتن --lo و --hi. تمام رکوردها را پیش از تولید هر خروجی در حافظه نگه می‌دارد. -c {character} نویسه پرکننده: پیش‌فرض '*'. -x {character} نویسه خارج از محدوده: پیش‌فرض '#'. -b {character} نویسه خالی: پیش‌فرض '.'. -h|--help نمایش این پیام. به‌طور اسمی نویسه‌های پرکننده، خارج از محدوده و خالی، رشته‌هایی به طول ۱ خواهند بود. با این وجود در صورت تمایل می‌توانید طول همه آن‌ها را بیشتر تعیین کنید. .fi .if n \{\ .RE.SS "bootstrap" .if n \{\ .RS 0 .\} .nf کاربرد: mlr bootstrap [گزینه‌ها] یک n-نمونه، با جایگذاری، از رکوردهای ورودی تولید می‌کند. همچنین ببینید: mlr sample و mlr shuffle. گزینه‌ها: -n {n} تعداد نمونه‌ها در خروجی. پیش‌فرض برابر با تعداد رکوردهای ورودی است. باید نامنفی باشد. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "bootstrap-ci" .if n \{\ .RS 0 .\} .nf کاربرد: mlr bootstrap-ci [گزینه‌ها] فواصل اطمینان بوت‌استرپ را برای آماره‌های فیلدهای مشخص‌شده، جمع‌آوری‌شده در طول جریان رکوردهای ورودی محاسبه می‌کند: مقادیر بارها با جایگذاری دوباره نمونه‌برداری می‌شوند، آماره روی هر بازنمونه‌گیری محاسبه می‌شود، و فاصله اطمینان از صدک‌های آماره‌های بازنمونه‌گیری‌شده به دست می‌آید. برای هر فیلد مقدار و هر آماره، آماره کل داده را در {field}_{stat} به همراه نقاط پایانی فاصله اطمینان در {field}_{stat}_lo و {field}_{stat}_hi چاپ می‌کند. برای نتایج تکرارپذیر از mlr --seed استفاده کنید. همچنین ببینید: mlr bootstrap و mlr stats1. گزینه‌ها: -a {mean,...} نام آماره‌ها برای بوت‌استرپ: یک یا چند مورد از مقادیر فهرست‌شده، همانند mlr stats1 -a. همچنین median (مشابه p50) و صدک‌های p{n} برای n در بازه 0..100 را می‌پذیرد. پیش‌فرض mean است. -f {a,b,c} نام فیلدهای مقداری که باید آماره روی آن‌ها محاسبه شود. الزامی است. -g {d,e,f} نام‌های اختیاری فیلدهای گروه‌بندی (group-by). -n {n} تعداد بازنمونه‌گیری‌های بوت‌استرپ. باید مثبت باشد. پیش‌فرض 1000 است. -c {level} سطح اطمینان، اکیداً بین 0 و 1. پیش‌فرض 0.95 است. -i استفاده از صدک‌های درون‌یابی‌شده، مانند type=7 در R، برای آماره‌های صدک و نیز برای نقاط پایانی فاصله اطمینان؛ پیش‌فرض مانند type=1. -h|--help نمایش این پیام. مثال: mlr --seed 12345 bootstrap-ci -f x,y مثال: mlr --seed 12345 bootstrap-ci -a mean,median -f x -g shape -n 5000 -c 0.99 .fi .if n \{\ .RE .SS "case" .if n \{\ .RS 0 .\} .nf کاربرد: mlr case [گزینه‌ها] بزرگ و کوچک کردن حروف رشته‌ها در کلیدها و/یا مقادیر رکورد. گزینه‌ها: -k تغییر حروف تنها برای کلیدها، نه کلیدها و مقادیر. -v تغییر حروف تنها برای مقادیر، نه کلیدها و مقادیر. -f {a,b,c} مشخص کردن نام فیلدهایی که باید تغییر کنند (پیش‌فرض: همه). -u تبدیل به حروف بزرگ (uppercase). -l تبدیل به حروف کوچک (lowercase). -s تبدیل به حروف اول جمله‌ای (بزرگ کردن حرف اول). -t تبدیل به حروف عنوان (بزرگ کردن حرف اول کلمات). -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "cat" .if n \{\ .RS 0 .\} .nf کاربرد: mlr cat [گزینه‌ها] انتقال مستقیم رکوردهای ورودی به خروجی. بسیار کاربردی برای تبدیل قالب. گزینه‌ها: -n افزودن فیلد "n" به ابتدای هر رکورد با شمارنده رکورد که از ۱ آغاز می‌شود. -N {name} افزودن فیلد {name} به ابتدای هر رکورد با شمارنده رکورد که از ۱ آغاز می‌شود. -g {a,b,c} نام‌های اختیاری فیلدهای گروه‌بندی برای شمارنده‌ها، مانند a,b,c. --filename افزودن نام فایل جاری به ابتدای هر رکورد. --filenum افزودن شماره فایل جاری (شروع از ۱) به ابتدای هر رکورد. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "check" .if n \{\ .RS 0 .\} .nf کاربرد: mlr check [گزینه‌ها] رکوردها را بدون چاپ هیچ‌گونه خروجی می‌خواند، به استثنای این‌که هشدارها در stderr چاپ می‌شوند. برای بررسی ساختار صحیح داده‌های ورودی کاربرد دارد. بررسی‌های کنونی عبارتند از: * داده‌ها قابل تجزیه باشند * آیا کلیدی رشته خالی است یا خیر گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "clean-whitespace" .if n \{\ .RS 0 .\} .nf کاربرد: mlr clean-whitespace [گزینه‌ها] برای هر رکورد و به ازای هر فیلد در رکورد، فاصله‌های خالی کلیدها و/یا مقادیر را پاک‌سازی می‌کند. پاک‌سازی فاصله‌های خالی شامل حذف فاصله‌های خالی ابتدا و انتها و جایگزینی فاصله‌های متوالی با یک فاصله است. برای کنترل دقیق‌تر، لطفاً توابع DSL مانند lstrip، rstrip، strip، collapse_whitespace و clean_whitespace را ببینید. گزینه‌ها: -k|--keys-only عدم تغییر مقادیر. -v|--values-only عدم تغییر کلیدها. -h|--help نمایش این پیام. مشخص کردن هم‌زمان -k و -v یک خطا است -- برای پاک‌سازی توأم کلیدها و مقادیر، هیچ‌یک از گزینه‌های -k و -v را مشخص نکنید. .fi .if n \{\ .RE.SS "count-distinct" .if n \{\ .RS 0 .\} .nf کاربرد: mlr count-distinct [گزینه‌ها] تعداد رکوردهای دارای مقادیر یکتا برای فیلدهای مشخص‌شده را چاپ می‌کند. مشابه با uniq -c. گزینه‌ها: -f {a,b,c} نام‌های فیلد برای شمارش یکتا (مترادف با -g). -g {a,b,c} نام‌های فیلد برای شمارش یکتا. -x {a,b,c} نام‌های فیلد برای استثنا کردن از شمارش یکتا؛ در عوض از دیگر فیلدهای هر رکورد استفاده می‌شود. -n صرفاً تعداد مقادیر یکتا را نمایش می‌دهد. با -u ناسازگار است. -o {name} نام فیلد برای خروجی شمارش. پیش‌فرض: "count". با -u نادیده گرفته می‌شود. -u انجام شمارش غیرمتصل (unlashed) برای چندین نام فیلد. با -f a,b و بدون -u، تعداد ترکیب‌های یکتای مقادیر فیلدهای a و b محاسبه می‌شود. با -f a,b و همراه با -u، تعداد مقادیر یکتای فیلد a و فیلد b به صورت جداگانه محاسبه می‌شود. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "count" .if n \{\ .RS 0 .\} .nf کاربرد: mlr count [گزینه‌ها] تعداد رکوردها را چاپ می‌کند، به صورت اختیاری گروه‌بندی‌شده بر اساس مقادیر یکتا برای فیلدهای مشخص‌شده. گزینه‌ها: -g {a,b,c} نام‌های اختیاری فیلدهای گروه‌بندی (group-by) برای شمارش، مثلاً a,b,c -n صرفاً تعداد مقادیر یکتا را نمایش می‌دهد. بدون -g کاربرد خاصی ندارد. -o {name} نام فیلد برای خروجی شمارش. پیش‌فرض: "count". -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "count-similar" .if n \{\ .RS 0 .\} .nf کاربرد: mlr count-similar [گزینه‌ها] تمام رکوردها را دریافت می‌کند، سپس هر رکورد را همراه با تعداد سایر رکوردهایی که دارای مقادیر فیلد گروه‌بندی یکسان هستند، منتشر می‌سازد. گزینه‌ها: -g {a,b,c} نام‌های فیلدهای گروه‌بندی (group-by) برای شمارش، مثلاً a,b,c -o {name} نام فیلد برای شمارش‌های خروجی. پیش‌فرض: "count". -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "cut" .if n \{\ .RS 0 .\} .nf کاربرد: mlr cut [گزینه‌ها] رکوردهای ورودی را همراه با فیلدهای مشخص‌شده مشمول یا مستثنی عبور می‌دهد. گزینه‌ها: -f {a,b,c} نام‌های فیلد جداشده با کاما جهت گنجاندن یا مستثنی کردن، مثلاً a,b,c. -o حفظ فیلدها با ترتیبی که در -f مشخص شده است، به جای ترتیب رکورد ورودی. -x|--complement مستثنی کردن نام‌های فیلد مشخص‌شده در -f، به جای گنجاندن آن‌ها. -r در نظر گرفتن نام‌های فیلد به عنوان عبارات باقاعده (regular expressions). عبارات "ab" و "a.*b" به ترتیب با هر نام فیلدی که حاوی زیررشته "ab" باشد یا با "a.*b" مطابقت داشته باشد، تطابق می‌یابند؛ لنگرهایی به شکل "^ab$" و "^a.*b$" نیز می‌توانند استفاده شوند. -h|--help نمایش این پیام. مثال‌ها: mlr cut -f hostname,status mlr cut -x -f hostname,status mlr cut -r -f '^status$,sda[0-9]' mlr cut -r -f '^status$,"sda[0-9]"' mlr cut -r -f '^status$,"sda[0-9]"i' (این مورد به بزرگی و کوچکی حروف حساس نیست) .fi .if n \{\ .RE .SS "decimate" .if n \{\ .RS 0 .\} .nf کاربرد: mlr decimate [گزینه‌ها] از هر n رکورد، یک رکورد را عبور می‌دهد؛ به صورت اختیاری بر اساس دسته‌بندی. گزینه‌ها: -b کاهش نمونه (decimate) با چاپ اولین رکورد از هر n تا. -e کاهش نمونه (decimate) با چاپ آخرین رکورد از هر n تا (پیش‌فرض). -g {a,b,c} نام‌های اختیاری فیلدهای گروه‌بندی برای شمارش کاهش نمونه، مثلاً a,b,c. -n {n} ضریب کاهش نمونه (پیش‌فرض 10). -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "describe" .if n \{\ .RS 0 .\} .nf کاربرد: mlr describe [گزینه‌ها] یک شمای فشرده برای داده‌های ورودی نمایش می‌دهد: نام فیلدها، انواع داده و ساختار مقادیر. به ازای هر فیلد ورودی یک رکورد خروجی تولید می‌کند که شامل انواع دیده‌شده، تعداد دفعات، کاردینالیتی، حداقل/حداکثر و (برای فیلدهای با کاردینالیتی پایین) مجموعه کامل مقادیر یکتا است. فیلدهای خروجی، یک رکورد به ازای هر فیلد ورودی: field_name نام فیلد ورودی types نگاشت از نام نوع داده (int، string و غیره) به تعداد رخداد count تعداد رکوردهایی که فیلد در آن‌ها ظاهر شده است null_count تعداد مقادیر فیلد که یا رشته خالی یا JSON null هستند distinct_count تعداد مقادیر یکتا برای فیلد min, max حداقل/حداکثر مقدار فیلد (هم برای رشته‌ها و هم برای اعداد عمل می‌کند) values تمام مقادیر یکتا، به ترتیب اولین مشاهده -- فقط برای فیلدهایی که distinct_count آن‌ها در محدوده -n قرار دارد نکات: * یکتایی بر اساس نمایش رشته‌ای محاسبه می‌شود -- بنابراین در اینجا 4.1 و 4.10 متمایز شمرده می‌شوند. * برای دریافت یک سند JSON ماشین‌خوان از `mlr --ojson describe` استفاده کنید؛ در قالب‌های خروجی جدولی، نگاشت types و آرایه values تخت (flatten) می‌شوند. * همچنین فعل summary را ببینید که آماره‌های خلاصه‌شده (میانگین، صدک‌ها و غیره) را گزارش می‌دهد. گزینه‌ها: -n|--max-values {n} مقادیر یکتای فیلد را تنها در صورتی فهرست می‌کند که حداکثر {n} مورد از آن‌ها وجود داشته باشد؛ مقدار 0 کلاً آرایه values را حذف می‌کند. پیش‌فرض: 20. -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "fill-down" .if n \{\ .RS 0 .\} .nf کاربرد: mlr fill-down [گزینه‌ها] اگر یک رکورد مشخص مقداری ناموجود برای فیلدی مشخص داشته باشد، در صورت وجود، آن را با مقدار متناظر از یک رکورد قبلی پر می‌کند. به‌طور پیش‌فرض، یک فیلد «ناموجود» یا غایب است و یا دارای مقدار رشته خالی است. با استفاده از ‎-a‎، فیلد تنها در صورتی «ناموجود» تلقی می‌شود که غایب باشد. گزینه‌ها: --all عملیات روی تمام فیلدهای ورودی اعمال شود. -a|--only-if-absent اگر یک رکورد مشخص مقداری ناموجود برای فیلدی مشخص داشته باشد، در صورت وجود، آن را با مقدار متناظر از رکورد قبلی پر می‌کند. به‌طور پیش‌فرض، یک فیلد «ناموجود» یا غایب است و یا دارای مقدار رشته خالی است. با ‎-a‎، فیلد تنها در صورتی «ناموجود» است که غایب باشد. -f {a,b,c} نام فیلدها برای fill-down. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "fill-empty" .if n \{\ .RS 0 .\} .nf کاربرد: mlr fill-empty [گزینه‌ها] فیلدهای رشته خالی را با مقدار fill-value مشخص‌شده پر می‌کند. گزینه‌ها: -v {string} مقدار جایگزین: پیش‌فرض "N/A" -S عدم استنتاج نوع -- بنابراین ‎'-v 0'‎ رشته‌ی 0 را پر می‌کند، نه عدد صحیح 0. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "filter" .if n \{\ .RS 0 .\} .nf کاربرد: mlr filter [گزینه‌ها] {DSL expression} به شما امکان می‌دهد از یک زبان خاص‌دامنه (DSL) برای فیلتر کردن برنامه‌نویسی‌شده‌ی اینکه کدام رکوردهای جریان در خروجی قرار گیرند، استفاده کنید. همچنین ببینید: https://miller.readthedocs.io/en/latest/reference-verbs گزینه‌ها: -f {file name} فایل حاوی عبارت DSL (مثال‌های زیر را ببینید). اگر نام فایل یک دایرکتوری باشد، تمام فایل‌های ‎*.mlr‎ در آن دایرکتوری بارگذاری می‌شوند. -e {expression} عبارت DSL برای ارزیابی. می‌توانید پس از ‎-f‎ برای افزودن یک عبارت از این گزینه استفاده کنید. نمونه کاربرد: تعریف توابع/زیرروال‌ها در فایلی که با ‎-f‎ مشخص می‌کنید، سپس فراخوانی آن‌ها با عبارتی که با ‎-e‎ مشخص شده است. -s {name=value} متغیر خارج از جریان ‎@name‎ را از پیش با مقدار داده‌شده مقداردهی می‌کند. بنابراین عبارت mlr put -s foo=97 '$column += @foo' مانند mlr put 'begin {@foo = 97} $column += @foo' عمل می‌کند. بخش مقدار مشمول استنتاج نوع است. می‌تواند بیش از یک بار مشخص شود، مانند ‎-s name1=value1 -s name2=value2‎. نکته: مقدار می‌تواند یک متغیر محیطی باشد، مثلاً ‎-s sequence=$SEQUENCE‎. -x رکوردهایی را چاپ می‌کند که عبارت {expression} برای آن‌ها به جای true به false ارزیابی می‌شود؛ یعنی معکوس کردن منطق عبارت فیلتر. پیش‌فرض false است. -q رکورد تغییریافته را در جریان خروجی قرار نمی‌دهد. برای زمانی مفید است که تمام خروجی مورد نظر در بلوک‌های begin و/یا end باشد. -S در Miller 6 و بالاتر بدون عمل (no-op) است، زیرا استنتاج نوع اکنون پیش از اجرای filter/put توسط رکوردخوان‌ها انجام می‌شود. جهت سازگاری با نسخه‌های پیشین به عنوان یک فلگ بی‌اثر پشتیبانی می‌شود. -F در Miller 6 و بالاتر بدون عمل (no-op) است، زیرا استنتاج نوع اکنون پیش از اجرای filter/put توسط رکوردخوان‌ها انجام می‌شود. جهت سازگاری با نسخه‌های پیشین به عنوان یک فلگ بی‌اثر پشتیبانی می‌شود. -w چاپ هشدارها درباره مواردی مانند متغیرهای مقداردهی‌نشده. -W مشابه ‎-w‎، اما در صورت وجود هرگونه هشدار، فرایند خاتمه می‌یابد. -p چاپ درخت نحو انتزاعی (AST) عبارت در stdout، که شفافیت کاملی از قوانین تقدم و شرکت‌پذیری گرامر Miller ارائه می‌دهد. -d مشابه ‎-p‎، اما از قالب عبارت پرانتزبندی‌شده برای AST استفاده می‌کند. -D مشابه ‎-d‎، اما با خروجی همگی در یک خط. -E بازتاب (Echo) عبارت DSL پیش از چاپ درخت تجزیه. -v مشابه ‎-E -p‎. -X خروج پس از تجزیه اما پیش از پردازش جریان. همراه با ‎-v/-d/-D‎، زمانی که فقط می‌خواهید اطلاعات تجزیه‌کننده را مشاهده کنید، کاربرد دارد. --explain تجزیه و بررسی نوع عبارت DSL، گزارش معتبر بودن آن، و خروج بدون خواندن جریان ورودی. وضعیت خروج در صورت معتبر بودن عبارت 0 و در غیر این صورت غیرصفر است؛ جهت دریافت خطای ماشین‌خوان، با ‎--errors-json‎ ترکیب شود. -h|--help نمایش این پیام. اگر ‎-e‎ و ‎-f‎ را با هم ترکیب کنید، عبارت‌ها به ترتیبی که دیده می‌شوند ارزیابی خواهند شد. از آنجا که قطعات عبارت صرفاً به هم الحاق می‌شوند، لطفاً حتماً از نقطه‌ویرگول (;) میانی برای جداسازی عبارت‌ها استفاده کنید. گزینه‌های اطلاعات تجزیه‌کننده عبارتند از: ‎-w‎،‏ ‎-W‎،‏ ‎-p‎،‏ ‎-d‎،‏ ‎-D‎،‏ ‎-E‎،‏ ‎-v‎ و ‎-X‎. رکوردها بسته به آخرین عبارت بولی خالص (bare-boolean) در عبارت DSL از فیلتر عبور خواهند کرد. این می‌تواند نتیجه‌ی <، ==، > و غیره باشد، یا مقدار بازگشتی یک فراخوانی تابع که مقدار بولی برمی‌گرداند، و غیره. مثال‌ها: mlr --csv --from example.csv filter '$color == "red"' mlr --csv --from example.csv filter '$color == "red" && flag == true' نمونه‌های بیشتر از عبارت‌های فیلتر: نخستین رکورد در هر فایل: 'FNR == 1' نمونه‌برداری فرعی: 'urand() < 0.001' بولی‌های مرکب: '$color != "blue" && $value > 4.2' '($x < 0.5 && $y < 0.5) || ($x > 0.5 && $y > 0.5)' عبارت‌های منظم با فلگ غیرحساس به حروف کوچک و بزرگ '($name =~ "^sys.*east$") || ($name =~ "^dev.[0-9]+"i)' انتساب‌ها، سپس دستور فیلتر بولی خالص: '$ab = $a+$b; $cd = $c+$d; $ab != $cd' دستور فیلتر بولی خالص درون یک شرطی: 'if (NR < 100) { $x > 0.3; } else { $x > 0.002; } ' استفاده از تابع مرتبه‌بالای 'any' برای بررسی اینکه آیا $index برابر 10، 20، یا 30 است: 'any([10,20,30], func(e) {return $index == e})' همچنین برای زمینه و اطلاعات بیشتر https://miller.readthedocs.io/reference-dsl را ببینید. .fi .if n \{\ .RE.SS "flatten" .if n \{\ .RS 0 .\} .nf کاربرد: mlr flatten [گزینه‌ها] نگاشت‌های چندسطحی را به تک‌سطحی مسطح می‌کند. مثال: فیلدی با نام 'a' و مقدار '{"b": { "c": 4 }}' به نام 'a.b.c' و مقدار 4 تبدیل می‌شود. گزینه‌ها: -f فهرستی از نام‌های فیلدها با کاما برای مسطح‌سازی (پیش‌فرض همه). -s {string} جداکننده، با مقدار پیش‌فرضِ mlr --flatsep. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "format-values" .if n \{\ .RS 0 .\} .nf کاربرد: mlr format-values [گزینه‌ها] رشته‌های قالب‌بندی را بسته به نوع تشخیص‌داده‌شده خودکار بر روی مقادیر تمامی فیلدها اعمال می‌کند. * اگر نوع مقدار فیلد عدد صحیح (integer) تشخیص داده شود، قالب عدد صحیح را اعمال می‌کند. * در غیر این صورت، اگر نوع مقدار فیلد اعشاری (float) تشخیص داده شود، قالب اعشاری را اعمال می‌کند. * در غیر این صورت، قالب رشته (string) را اعمال می‌کند. نکته: این یک روش سریع و کم‌کلید برای اعمال قالب‌بندی روی فیلدهای پرشمار است. برای دستیابی به کنترل دقیق‌تر، لطفاً تابع fmtnum را در DSL دستور mlr put ببینید. نکته: این فعل به شما امکان می‌دهد رشته‌های قالب‌بندی دلخواه را اعمال کنید، که می‌تواند منجر به رفتار تعریف‌نشده و/یا از کار افتادن برنامه شود. به "man printf" در سیستم خود مراجعه کنید. گزینه‌ها: -i {قالب integer} رشته قالب‌بندی عدد صحیح؛ پیش‌فرض "%d". مثال‌ها: "%06lld"، "%08llx". توجه داشته باشید که اعداد صحیح Miller از نوع long long هستند، بنابراین باید از قالب‌هایی استفاده کنید که برای long long به کار می‌روند، مانند آن‌هایی که ll دارند. در غیر این صورت منجر به رفتار تعریف‌نشده می‌شود. -f {قالب float} رشته قالب‌بندی عدد اعشاری؛ پیش‌فرض "%f". مثال‌ها: "%8.3lf"، "%.6le". توجه داشته باشید که اعداد اعشاری Miller از نوع دقت مضاعف (double) هستند، بنابراین باید از قالب‌هایی استفاده کنید که برای double به کار می‌روند، مانند آن‌هایی که l[efg] دارند. در غیر این صورت منجر به رفتار تعریف‌نشده می‌شود. -s {قالب string} رشته قالب‌بندی رشته؛ پیش‌فرض "%s". مثال‌ها: "_%s"، "%08s". توجه داشته باشید که باید از قالب‌هایی استفاده کنید که برای رشته به کار می‌روند، مانند آن‌هایی که s دارند. در غیر این صورت منجر به رفتار تعریف‌نشده می‌شود. -n تبدیل اجباری مقادیر فیلدهایی که خودکار int تشخیص داده شده‌اند به float، و سپس اعمال قالب float. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "fraction" .if n \{\ .RS 0 .\} .nf کاربرد: mlr fraction [گزینه‌ها] برای مقدار هر رکورد در فیلدهای مشخص‌شده، نسبت آن مقدار به مجموع مقادیر آن فیلد را در تمامی رکوردهای ورودی محاسبه می‌کند. به عنوان مثال با رکوردهای ورودی x=1 x=2 x=3 و x=4، رکوردهای خروجی زیر را صادر می‌کند: x=1,x_fraction=0.1 x=2,x_fraction=0.2 x=3,x_fraction=0.3 و x=4,x_fraction=0.4 نکته: این دستور از نظر داخلی یک الگوریتم دوگذرگاهی است: در گذر اول رکوردهای ورودی را نگه داشته و مجموع‌ها را محاسبه می‌کند؛ در گذر دوم خارج‌قسمت‌ها را محاسبه کرده و رکوردهای خروجی را صادر می‌کند. این بدان معناست که تا زمان خوانده شدن تمام ورودی، هیچ خروجی تولید نمی‌کند. گزینه‌ها: -f {a,b,c} نام فیلد(ها) برای محاسبه کسر/نسبت -g {d,e,f} نام فیلد(های) اختیاری دسته‌بندی (group-by) برای شمارش‌های نسبت -p تولید درصد [0..100] به جای کسر [0..1]. نام فیلدهای خروجی به جای "_fraction" با "_percent" خاتمه می‌یابند -c تولید توزیع تجمعی، یعنی مجموع‌های متوالی: هر مقدار خروجی با مجموع مقادیر قبلی برای گروه مشخص‌شده جمع می‌شود. به عنوان مثال با رکوردهای ورودی x=1 x=2 x=3 و x=4، رکوردهای خروجی زیر را صادر می‌کند: x=1,x_cumulative_fraction=0.1 x=2,x_cumulative_fraction=0.3 x=3,x_cumulative_fraction=0.6 و x=4,x_cumulative_fraction=1.0 -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "gap" .if n \{\ .RS 0 .\} .nf کاربرد: mlr gap [گزینه‌ها] به ازای هر n رکورد، یا هنگامی که مقادیر خاصی تغییر می‌کنند، یک رکورد خالی صادر می‌کند. تعیین یکی از گزینه‌های -n یا -g الزامی است. گزینه‌ها: -g {a,b,c} چاپ یک شکاف هر زمان که مقادیر این فیلدها (مثلاً a,b,c) تغییر کند. -n {n} چاپ یک شکاف به ازای هر n رکورد. در صورت وجود -g نادیده گرفته می‌شود. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "grep" .if n \{\ .RS 0 .\} .nf کاربرد: mlr grep [گزینه‌ها] {عبارت باقاعده} رکوردهایی را که با عبارت باقاعده مطابقت دارند، عبور می‌دهد. گزینه‌ها: -i استفاده از جستجوی غیرحساس به حروف کوچک و بزرگ. -v معکوس کردن: عبور رکوردهایی که با regex مطابقت ندارند. -a فقط grep بر روی مقادیر، نه کلیدها و مقادیر. -h|--help نمایش این پیام. توجه داشته باشید که "mlr filter" قدرتمندتر است، اما مستلزم آن است که نام فیلدها را بدانید. در مقابل، "mlr grep" به شما امکان می‌دهد کل رکورد را با regex مطابقت دهید. این کار با قالب‌بندی هر رکورد در حافظه به صورت DKVP (یا NIDX، اگر -a مشخص شده باشد)، با استفاده از OFS برابر "," و OPS برابر "="، و سپس مطابقت دادن خط حاصل با regex مشخص‌شده در اینجا انجام می‌شود. به ویژه، regex بر روی جریان ورودی اعمال نمی‌شود: اگر فایلی با قالب CSV با خط سرایند "x,y,z" و خط داده "1,2,3" داشته باشید، regex نه با هیچ‌یک از این خطوط، بلکه با خط DKVP به صورت "x=1,y=2,z=3" مطابقت داده خواهد شد. علاوه بر این، همه گزینه‌های grep سیستمی پشتیبانی نمی‌شوند، و این دستور صرفاً برای صرفه‌جویی در تایپ در نظر گرفته شده است. برای دسترسی به تمامی قابلیت‌های grep سیستمی، می‌توانید دستور زیر را اجرا کنید: "mlr --odkvp ... | grep ... | mlr --idkvp ..." .fi .if n \{\ .RE.SS "group-by" .if n \{\ .RS 0 .\} .nf کاربرد: mlr group-by [options] {comma-separated field names} رکوردها را در دسته‌هایی با مقادیر یکسان در فیلدهای مشخص‌شده خروجی می‌دهد. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "group-like" .if n \{\ .RS 0 .\} .nf کاربرد: mlr group-like [options] رکوردها را در دسته‌هایی با نام‌های فیلد یکسان خروجی می‌دهد. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "gsub" .if n \{\ .RS 0 .\} .nf کاربرد: mlr gsub [options] رشته قدیمی را با رشته جدید در فیلد(های) مشخص‌شده جایگزین می‌کند، همراه با پشتیبانی از regex برای رشته قدیمی و مدیریت تطابق‌های چندگانه، مانند تابع DSL با نام `gsub`. رشته جایگزین از نویسه‌های گریز ممیز وارونه به سبک C مانند \en، \et و \ex1f پشتیبانی می‌کند. برای درج ممیز وارونه واقعی، \e\e را بنویسید. همچنین افعال `sub` و `ssub` را ببینید. گزینه‌ها: -f {a,b,c} نام‌های فیلد برای اعمال جایگزینی روی آن‌ها. -r {regex} عبارت باقاعده برای نام‌های فیلدی که جایگزینی روی آن‌ها اعمال می‌شود. -a اعمال جایگزینی روی تمام فیلدها. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "having-fields" .if n \{\ .RS 0 .\} .nf کاربرد: mlr having-fields [options] به‌طور مشروط و بسته به نام‌های فیلد هر رکورد، رکوردها را عبور می‌دهد. گزینه‌ها: --at-least {comma-separated names} عبور رکوردهایی که حداقل این نام‌های فیلد را دارند. --which-are {comma-separated names} عبور رکوردهایی که نام‌های فیلد آن‌ها دقیقاً همین موارد است. --at-most {comma-separated names} عبور رکوردهایی که حداکثر این نام‌های فیلد را دارند. --all-matching {regular expression} عبور رکوردهایی که تمام نام‌های فیلد آن‌ها با regex مطابقت دارند. --any-matching {regular expression} عبور رکوردهایی که حداقل یکی از نام‌های فیلد آن‌ها با regex تطابق دارد. --none-matching {regular expression} عبور رکوردهایی که هیچ‌یک از نام‌های فیلد آن‌ها با regex تطابق ندارد. -h|--help نمایش این پیام. مثال‌ها: mlr having-fields --which-are amount,status,owner mlr having-fields --any-matching 'sda[0-9]' mlr having-fields --any-matching '"sda[0-9]"' mlr having-fields --any-matching '"sda[0-9]"i' (بدون حساسیت به حروف بزرگ و کوچک) .fi .if n \{\ .RE .SS "head" .if n \{\ .RS 0 .\} .nf کاربرد: mlr head [options] n رکورد نخست را عبور می‌دهد، در صورت تمایل بر اساس دسته‌بندی. بدون -g، پس از خواندن n رکورد، مصرف ورودی بیشتر متوقف می‌شود (یعنی سریع است). گزینه‌ها: -g {a,b,c} نام‌های فیلد اختیاری group-by برای شمارش رکوردها، مثلاً a,b,c. -n {n} تعداد رکوردهای ابتدایی برای چاپ. پیش‌فرض 10. یک مقدار منفی، مثلاً -n -2، به جز n رکورد آخر همه را عبور می‌دهد، اختیاری بر اساس دسته‌بندی. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "histogram" .if n \{\ .RS 0 .\} .nf فقط یک هیستوگرام. مقادیر ورودی کمتر از lo یا بیشتر از hi شمرده نمی‌شوند. کاربرد: mlr histogram [options] گزینه‌ها: -f {a,b,c} نام‌های فیلد مقدار برای شمارش‌های هیستوگرام. --lo {lo} مقدار پایین هیستوگرام. --hi {hi} مقدار بالای هیستوگرام. --nbins {n} تعداد بازه‌های هیستوگرام. پیش‌فرض 20 است. --auto محاسبه خودکار حدود، با نادیده گرفتن --lo و --hi. تمام مقادیر را قبل از تولید هرگونه خروجی در حافظه نگه می‌دارد. -o {prefix} پیشوند برای نام فیلد خروجی. پیش‌فرض: بدون پیشوند. -s چاپ یک sparkline یونیکد تک‌خطی به ازای هر فیلد به جای شمارش هر بازه. -h|--help نمایش این پیام. با -s، خروجی به جای یک رکورد به ازای هر بازه، یک رکورد به ازای هر فیلد مقدار همراه با یک فیلد sparkline خواهد بود. .fi .if n \{\ .RE .SS "json-parse" .if n \{\ .RS 0 .\} .nf کاربرد: mlr json-parse [options] تلاش می‌کند مقادیر رشته‌ای فیلدها را به JSON تجزیه‌شده تبدیل کند، مثلاً "[1,2,3]" -> [1,2,3]. گزینه‌ها: -f {a,b,c} فهرستی از نام‌های فیلد جداشده با کاما برای json-parse (پیش‌فرض همه). -k در صورت ارائه، هنگام شکست تجزیه برای هر خانه (cell)، مقدار ورودی (غیرقابل تجزیه) آن خانه حفظ می‌شود. -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "json-stringify" .if n \{\ .RS 0 .\} .nf کاربرد: mlr json-stringify [گزینه‌ها] تولید مقادیر رشته‌ای فیلدها از داده‌های فیلد-مقدار، مثلاً [1,2,3] -> "[1,2,3]". گزینه‌ها: -f {a,b,c} فهرست جداشده با کاما از نام فیلدها برای json-stringify (پیش‌فرض همه). --jvstack تولید خروجی JSON چندخطی. --no-jvstack تولید خروجی JSON تک‌خطی به ازای هر رکورد (پیش‌فرض). -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "join" .if n \{\ .RS 0 .\} .nf کاربرد: mlr join [گزینه‌ها] پیوند زدن رکوردهای نام فایل چپِ مشخص‌شده با رکوردهای تمام فایل‌ها در انتهای فهرست آرگومان‌های Miller. عملکرد اساساً مشابه دستور سیستمی "join" است، اما برای جریان‌های رکورد. گزینه‌ها: -f {نام فایل چپ} نام فایل چپ برای پیوند (join). -j {a,b,c} نام فیلدهای پیوند جداشده با کاما برای خروجی. -l {a,b,c} نام فیلدهای پیوند جداشده با کاما برای فایل ورودی چپ؛ در صورت عدم ذکر، پیش‌فرض مقادیر -j است. -r {a,b,c} نام فیلدهای پیوند جداشده با کاما برای فایل(های) ورودی راست؛ در صورت عدم ذکر، پیش‌فرض مقادیر -j است. --lk|--left-keep-field-names {a,b,c} در صورت تعیین، یعنی تنها نام فیلدهای مشخص‌شده از فایل چپ نگه داشته شوند. به طور خودکار شامل نام فیلد(های) پیوند می‌شود. برای زمانی که تنها زیرمجموعه محدودی از اطلاعات فایل چپ را می‌خواهید بسیار مفید است. نکته: می‌توانید از "" lk-- استفاده کنید: این کار یعنی فایل چپ صرفاً به عنوان انتخاب‌کننده سطر برای فایل‌های ورودی عمل می‌کند. --lp {متن} پیشوند اضافی برای نام فیلدهای خروجی غیرپیوندی از فایل چپ. برای رکوردهای خروجی جفت‌شده و جفت‌نشده اعمال می‌شود. --rp {متن} پیشوند اضافی برای نام فیلدهای خروجی غیرپیوندی از فایل(های) راست. برای رکوردهای خروجی جفت‌شده و جفت‌نشده اعمال می‌شود. --np عدم انتشار رکوردهای جفت‌شده. --ul انتشار رکوردهای جفت‌نشده از فایل چپ. --ur انتشار رکوردهای جفت‌نشده از فایل(های) راست. --ignore-empty با رکوردهایی که دارای رشته خالی در هر یک از فیلدهای پیوند هستند طوری رفتار می‌کند که انگار آن فیلد پیوند هم در فایل چپ و هم راست وجود ندارد. چنین رکوردهایی هرگز جفت نمی‌شوند \- حتی با یکدیگر \- و طبق معمول مشمول np/--ul/--ur-- به عنوان جفت‌نشده در نظر گرفته می‌شوند. -s|--sorted-input نیاز به ورودی مرتب‌شده: رکوردها باید به صورت لغوی بر اساس نام فیلدهای پیوند خود مرتب شده باشند، در غیر این صورت همه رکوردها جفت نخواهند شد. تنها مورد کاربرد محتمل این گزینه برای فایل چپی است که بیش از حد بزرگ بوده و در حافظه سیستم جا نمی‌شود. -u فعال‌سازی ورودی نامرتب. (این حالت پیش‌فرض است حتی بدون u-.) در این حالت، کل فایل چپ در حافظه بارگذاری خواهد شد. --prepipe {دستور} دستور شل برای هدایت ورودی فایل چپ از طریق prepipe. مانند گزینه‌های ورودی اصلی؛ برای جزئیات mlr --help را ببینید. اگر می‌خواهید از یک دستور prepipe برای ورودی اصلی و هم در اینجا استفاده کنید، باید هم در آنجا و هم در اینجا مشخص شود. --prepipex {دستور} دستور شل برای هدایت ورودی فایل چپ از طریق prepipe (بدون نقل‌قول شل). مانند گزینه‌های ورودی اصلی؛ برای جزئیات mlr --help را ببینید. -h|--help نمایش این پیام. گزینه‌های قالب فایل به طور پیش‌فرض همان گزینه‌های نام‌های فایل راست در فهرست آرگومان‌های Miller هستند، اما می‌توان آن‌ها را برای فایل چپ به شرح زیر بازنویسی کرد. لطفاً برای اطلاعات بیشتر درباره نحوه نگارش این آرگومان‌ها به «mlr --help» اصلی مراجعه کنید: -i {نام قالب} برای قالب فایل چپ، مثلاً 'csv' یا 'json'. یا پرچم‌هایی مانند icsv--، ijson-- و غیره: 'icsv--' معادل 'i csv-' است، و الی آخر. --irs {نویسه جداکننده رکورد} --ifs {نویسه جداکننده فیلد} --ips {نویسه جداکننده جفت} --repifs --implicit-csv-header --implicit-tsv-header --no-implicit-csv-header --no-implicit-tsv-header به عنوان مثال، اگر '... mlr --csv ... join -l foo' داشته باشید، قالب فایل چپ نیز CSV تعیین می‌شود مگر اینکه با '... mlr --csv ... join --ijson -l foo' و غیره آن را لغو کنید. همین‌طور، اگر '... mlr --csv --implicit-csv-header' داشته باشید، انتظار می‌رود فایل پیوندی ورودی نیز بدون سربرگ باشد مگر اینکه بعد از 'join' عبارت 'no-implicit-csv-header--' را قرار دهید. لطفاً برای اطلاعات درباره تعیین جداکننده‌ها از «mlr --usage-separator-options» استفاده کنید. لطفاً برای اطلاعات بیشتر شامل مثال‌ها به https://miller.readthedocs.io/en/latest/reference-verbs#join مراجعه کنید. .fi .if n \{\ .RE .SS "label" .if n \{\ .RS 0 .\} .nf کاربرد: mlr label [گزینه‌ها] {new1,new2,new3,...} با دریافت n نام جداشده با کاما، n فیلد نخست هر رکورد را تغییر نام می‌دهد تا نام مربوطه را به خود بگیرند. (فیلدهای پس از فیلد n‌اُم با نام اصلی خود باقی می‌مانند.) به‌ویژه با inidx-- یا implicit-csv-header-- برای نام‌گذاری مفید فیلدهایی که در غیر این صورت دارای اندیس‌های عددی صحیح هستند، بسیار کاربردی است. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "latin1-to-utf8" .if n \{\ .RS 0 .\} .nf کاربرد: mlr latin1-to-utf8، بدون هیچ گزینه‌ای. رشته‌های رکورد را به صورت بازگشتی از Latin-1 به UTF-8 تبدیل می‌کند. برای کنترل در سطح فیلد، لطفاً تابع DSL با نام latin1_to_utf8 را ببینید. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "least-frequent" .if n \{\ .RS 0 .\} .nf کاربرد: mlr least-frequent [گزینه‌ها] کم‌تکرارترین مقادیر متمایز را برای نام فیلدهای مشخص‌شده نشان می‌دهد. نخستین مدخل، ضد نما (anti-mode) آماری است؛ باقی موارد در رتبه‌های بعدی قرار دارند. گزینه‌ها: -f {a,b,c} یک یا چند نام فیلد جداشده با کاما برای گروه‌بندی. پرچم الزامی. -n {count} حداکثر تعداد نتایج در خروجی. پرچم اختیاری با پیش‌فرض ۱۰. -b حذف شمارش‌ها؛ تنها نمایش مقادیر فیلد. -o {name} نام فیلد برای شمارش در خروجی. پیش‌فرض "count". -h|--help نمایش این پیام. همچنین ببینید: "mlr most-frequent". .fi .if n \{\ .RE .SS "merge-fields" .if n \{\ .RS 0 .\} .nf کاربرد: mlr merge-fields [گزینه‌ها] آمار تک‌متغیره را برای هر رکورد ورودی، تجمیع‌شده در فیلدهای مشخص‌شده، محاسبه می‌کند. گزینه‌ها: -a {sum,count,...} نام‌های تجمیع‌کننده‌ها: یک یا چند مورد از تجمیع‌کننده‌های فهرست‌شده در زیر. -f {a,b,c} نام فیلدهای مقداری که آمار روی آن‌ها محاسبه می‌شود. نیازمند -o است. -r {a,b,c} عبارات باقاعده برای نام فیلدهای مقداری که آمار روی آن‌ها محاسبه می‌شود. نیازمند -o است. -c {a,b,c} زیررشته‌ها برای حالت فروپاشی: تمام فیلدهایی که پس از حذف زیررشته‌ها نام یکسانی داشته باشند با هم تجمیع می‌شوند. لطفاً مثال‌های زیر را ببینید. -i استفاده از صدک‌های درون‌یابی‌شده، مانند type=7 در R؛ پیش‌فرض مانند type=1 است. برای فیلدهای دارای مقادیر رشته‌ای بی‌معنی است. -o {name} نام پایه فیلد خروجی برای -f/-r. -k نگه‌داشتن فیلدهای ورودی که در آمار خروجی سهیم بوده‌اند؛ پیش‌فرض بر حذف آن‌هاست. -S پرچم بی‌اثر (No-op) برای سازگاری عقبروی با Miller 5. -F پرچم بی‌اثر (No-op) برای سازگاری عقبروی با Miller 5. -h|--help نمایش این پیام. تجمیع‌کننده‌ها برای -a: count شمارش نمونه‌های فیلدها null_count شمارش تعداد نمونه‌های رشته‌خالی/JSON-null به ازای هر فیلد distinct_count شمارش تعداد مقادیر متمایز به ازای هر فیلد mode یافتن پرتکرارترین مقادیر فیلدها؛ در برابری، نخستین مورد برنده است antimode یافتن کم‌تکرارترین مقادیر فیلدها؛ در برابری، نخستین مورد برنده است sum محاسبه مجموع فیلدهای مشخص‌شده mean محاسبه میانگین‌ها (میانگین‌های نمونه) فیلدهای مشخص‌شده mad محاسبه انحراف میانگین مطلق (MAD) var محاسبه واریانس نمونه فیلدهای مشخص‌شده stddev محاسبه انحراف معیار نمونه فیلدهای مشخص‌شده meaneb تخمین میله‌های خطا برای میانگین‌ها (با فرض عدم خودهمبستگی نمونه) skewness محاسبه چولگی نمونه فیلدهای مشخص‌شده kurtosis محاسبه کشیدگی نمونه فیلدهای مشخص‌شده min محاسبه مقادیر کمینه فیلدهای مشخص‌شده max محاسبه مقادیر بیشینه فیلدهای مشخص‌شده minlen محاسبه حداقل طول رشته‌های فیلدهای مشخص‌شده maxlen محاسبه حداکثر طول رشته‌های فیلدهای مشخص‌شده داده‌های دارای مقدار رشته‌ای تا زمانی که نیازی به محاسبات ریاضی روی آن‌ها نباشد معنادار هستند، مانند sum،‏ mean، صدک‌های درون‌یابی‌شده و غیره. در صورت مخلوط بودن داده‌ها، اعداد کوچک‌تر از رشته‌ها فرض می‌شوند. داده ورودی نمونه: "a_in_x=1,a_out_x=2,b_in_y=4,b_out_x=8". مثال: mlr merge-fields -a sum,count -f a_in_x,a_out_x -o foo خروجی "b_in_y=4,b_out_x=8,foo_sum=3,foo_count=2" را تولید می‌کند زیرا فیلدهای "a_in_x,a_out_x" با هم جمع شده‌اند. مثال: mlr merge-fields -a sum,count -r in_,out_ -o bar خروجی "bar_sum=15,bar_count=4" را تولید می‌کند زیرا هر چهار فیلد با هم جمع شده‌اند. مثال: mlr merge-fields -a sum,count -c in_,out_ خروجی "a_x_sum=3,a_x_count=2,b_y_sum=4,b_y_count=1,b_x_sum=8,b_x_count=1" را تولید می‌کند، زیرا "a_in_x" و "a_out_x" هر دو به "a_x" فروپاشی می‌شوند، "b_in_y" به "b_y" و "b_out_x" به "b_x" فروپاشی می‌شود. .fi .if n \{\ .RE .SS "most-frequent" .if n \{\ .RS 0 .\} .nf کاربرد: mlr most-frequent [گزینه‌ها] پرتکرارترین مقادیر متمایز را برای نام فیلدهای مشخص‌شده نشان می‌دهد. نخستین مدخل، مد (نما) آماری است؛ باقی موارد در رتبه‌های بعدی قرار دارند. گزینه‌ها: -f {a,b,c} یک یا چند نام فیلد جداشده با کاما برای گروه‌بندی. پرچم الزامی. -n {count} حداکثر تعداد نتایج در خروجی. پرچم اختیاری با پیش‌فرض ۱۰. -b حذف شمارش‌ها؛ تنها نمایش مقادیر فیلد. -o {name} نام فیلد برای شمارش در خروجی. پیش‌فرض "count". -h|--help نمایش این پیام. همچنین ببینید: "mlr least-frequent". .fi .if n \{\ .RE .SS "nest" .if n \{\ .RS 0 .\} .nf کاربرد: mlr nest [گزینه‌ها] مقادیر فیلدهای مشخص‌شده را به فیلدها/رکوردهای جداگانه تجزیه می‌کند، یا برعکس. گزینه‌ها: --explode تجزیه مقادیر فیلد به فیلدها/رکوردهای مجزا. یکی از گزینه‌های --explode یا --implode الزامی است. --implode عکس --explode. یکی از گزینه‌های --explode یا --implode الزامی است. --values عملیات روی مقادیر فیلد. یکی از گزینه‌های --values یا --pairs الزامی است. --pairs عملیات روی جفت‌های کلید-مقدار فیلد. یکی از گزینه‌های --values یا --pairs الزامی است. --across-records تجزیه/ترکیب در طول رکوردها. یکی از گزینه‌های --across-records یا --across-fields الزامی است. --across-fields تجزیه/ترکیب در طول فیلدها. یکی از گزینه‌های --across-records یا --across-fields الزامی است. -f {field name} نام فیلد الزامی برای انجام عملیات روی آن. -r {field names} مانند -f اما با آرگومان‌ها به عنوان عبارت باقاعده رفتار می‌کند. با همه نام‌های فیلد مطابقت یافته و به ترتیب رکورد روی هر کدام اعمال می‌شود. مثال: -r '^[xy]$'. --nested-fs {string} جداکننده فیلد برای مقادیر تودرتو. پیش‌فرض ";". --nested-ps {string} جداکننده جفت برای جفت‌های کلید-مقدار تودرتو. پیش‌فرض ":". --evar {string} کوتاه‌نوشتی برای --explode --values --across-records --nested-fs {string}. --ivar {string} کوتاه‌نوشتی برای --implode --values --across-records --nested-fs {string}. -h|--help نمایش این پیام. لطفاً برای اطلاعات در مورد مشخص‌کردن جداکننده‌ها از "mlr --usage-separator-options" استفاده کنید. مثال‌ها: mlr nest --explode --values --across-records -f x با رکورد ورودی "x=a;b;c,y=d" رکوردهای خروجی زیر را تولید می‌کند: "x=a,y=d" "x=b,y=d" "x=c,y=d" برای انجام عمل برعکس از --implode استفاده کنید. mlr nest --explode --values --across-fields -f x با رکورد ورودی "x=a;b;c,y=d" رکوردهای خروجی زیر را تولید می‌کند: "x_1=a,x_2=b,x_3=c,y=d" برای انجام عمل برعکس از --implode استفاده کنید. mlr nest --explode --pairs --across-records -f x با رکورد ورودی "x=a:1;b:2;c:3,y=d" رکوردهای خروجی زیر را تولید می‌کند: "a=1,y=d" "b=2,y=d" "c=3,y=d" mlr nest --explode --pairs --across-fields -f x با رکورد ورودی "x=a:1;b:2;c:3,y=d" رکوردهای خروجی زیر را تولید می‌کند: "a=1,b=2,c=3,y=d" نکات: * با --pairs، گزینه --implode معنا ندارد زیرا نام اصلی فیلد از دست رفته است. * ترکیب "--implode --values --across-records" غیرجریانی (non-streaming) است: هیچ رکورد خروجی تولید نمی‌شود تا زمانی که همه رکوردهای ورودی خوانده شوند. به ویژه این به معنای عدم کارکرد در بافت‌های `tail -f` است. اما سایر ترکیب‌های پرچم‌ها منجر به پردازش داده جریانی (سازگار با `tail -f`) می‌شوند. اگر ورودی از `tail -f` می‌آید، حتماً از `--records-per-batch 1` استفاده کنید. * اطمینان از اینکه nested-fs از IFS داده‌های شما متمایز باشد به عهده شماست: برای مثال به‌طور پیش‌فرض اولی نقطه‌ویرگول و دومی کاما است. همچنین ببینید: mlr reshape. .fi .if n \{\ .RE.SS "nothing" .if n \{\ .RS 0 .\} .nf کاربرد: mlr nothing [گزینه‌ها] تمام رکوردهای ورودی را دور می‌ریزد. برای آزمایش، یا پس از آنکه دستورهایی مانند tee/print/غیره خروجی دیگری تولید کرده‌اند، مفید است. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "put" .if n \{\ .RS 0 .\} .nf کاربرد: mlr put [گزینه‌ها] {DSL expression} به شما امکان می‌دهد با استفاده از یک زبان ویژه دامنه (DSL) رکوردهای جریان را به صورت برنامه‌نویسی‌شده تغییر دهید. همچنین ببینید: https://miller.readthedocs.io/en/latest/reference-verbs گزینه‌ها: -f {file name} فایلی حاوی یک عبارت DSL (مثال‌های زیر را ببینید). اگر نام فایل یک دایرکتوری باشد، تمام فایل‌های *.mlr در آن دایرکتوری بارگذاری می‌شوند. -e {expression} عبارت DSL برای ارزیابی. می‌توانید از این پس از -f برای افزودن یک عبارت استفاده کنید. مورد کاربرد نمونه: تعریف توابع/زیرروال‌ها در فایلی که با -f مشخص می‌کنید، سپس فراخوانی آن‌ها با عبارتی که با -e مشخص می‌کنید. -s {name=value} متغیر خارج از جریان @name را از پیش مقداردهی می‌کند تا مقدار داده‌شده را داشته باشد. بنابراین mlr put -s foo=97 '$column += @foo' مانند mlr put 'begin {@foo = 97} $column += @foo' است. بخش مقدار، مشمول استنتاج نوع (type-inferencing) است. می‌تواند بیش از یک بار مشخص شود، مانند -s name1=value1 -s name2=value2. توجه: مقدار می‌تواند یک متغیر محیطی باشد، مانند -s sequence=$SEQUENCE. -x رکوردهایی را چاپ می‌کند که {expression} برای آن‌ها نادرست (false) ارزیابی شود، نه درست (true)، یعنی معکوس کردن منطق عبارت فیلتر. پیش‌فرض false است. -q رکورد اصلاح‌شده را در جریان خروجی شامل نمی‌کند. برای زمانی مفید است که تمام خروجی مورد نظر در بلوک‌های begin و/یا end باشد. -S در Miller نسخه ۶ و بالاتر بی‌اثر (No-op) است، زیرا استنتاج نوع اکنون پیش از اجرای filter/put توسط record-readerها انجام می‌شود. برای سازگاری رو به عقب به عنوان یک پرچم گذرا و بی‌اثر پشتیبانی می‌شود. -F در Miller نسخه ۶ و بالاتر بی‌اثر (No-op) است، زیرا استنتاج نوع اکنون پیش از اجرای filter/put توسط record-readerها انجام می‌شود. برای سازگاری رو به عقب به عنوان یک پرچم گذرا و بی‌اثر پشتیبانی می‌شود. -w چاپ هشدارها درباره مواردی مانند متغیرهای مقداردهی‌نشده. -W مشابه -w، اما در صورت وجود هرگونه هشدار، فرایند را متوقف می‌کند. -p درخت نحو انتزاعی (AST) عبارت را در stdout چاپ می‌کند، که شفافیت کاملی از قوانین تقدم و شرکت‌پذیری گرامر Miller ارائه می‌دهد. -d مشابه -p، اما از قالبی با عبارت‌های پرانتزبندی‌شده برای AST استفاده می‌کند. -D مشابه -d، اما با خروجی تماماً در یک خط. -E عبارت DSL را پیش از چاپ درخت تجزیه بازتاب می‌دهد (echo). -v مشابه -E -p. -X پس از تجزیه اما پیش از پردازش جریان خارج می‌شود. در صورتی که فقط می‌خواهید اطلاعات تجزیه‌کننده را ببینید، همراه با -v/-d/-D مفید است. --explain عبارت DSL را تجزیه و بررسی نوع می‌کند، معتبر بودن آن را گزارش می‌دهد، و بدون خواندن جریان ورودی خارج می‌شود. وضعیت خروج در صورت معتبر بودن عبارت ۰ و در غیر این صورت غیرصفر است؛ برای دریافت خطای ماشین‌خوان با --errors-json ترکیب کنید. -h|--help نمایش این پیام. در صورت ترکیب -e و -f، عبارت‌ها به ترتیبی که با آن‌ها مواجه می‌شود ارزیابی می‌شوند. از آنجا که بخش‌های عبارت صرفاً به هم الحاق می‌شوند، لطفاً مطمئن شوید که برای جداسازی عبارت‌ها از نقطه‌ویرگول در میان آن‌ها استفاده می‌کنید. گزینه‌های اطلاعات تجزیه‌کننده عبارتند از: -w، -W، -p، -d، -D، -E، -v و -X. مثال‌ها: mlr --from example.csv put '$qr = $quantity * $rate' مثال‌های بیشتر از عبارت‌های put: دستورهای شرطی (If-statements): 'if ($flag == true) { $quantity *= 10}' 'if ($x > 0.0) { $y=log10($x); $z=sqrt($y) } else {$y = 0.0; $z = 0.0}' فیلدهای تازه ایجادشده پس از نوشته‌شدن قابل خواندن هستند: '$new_field = $index**2; $qn = $quantity * $new_field' جایگزینی عبارت منظم (Regex-replacement): '$name = sub($name, "http.*com"i, "")' گرفتن الگو با عبارت منظم (Regex-capture): 'if ($a =~ "([a-z]+)_([0-9]+)") { $b = "left_\e1"; $c = "right_\e2" }' متغیرهای توکار (Built-in variables): '$filename = FILENAME' تجمع‌ها (از mlr put -q استفاده کنید): '@sum += $x; end {emit @sum}' '@sum[$shape] += $quantity; end {emit @sum, "shape"}' '@sum[$shape][$color] += $x; end {emit @sum, "shape", "color"}' ' @min = min(@min,$x); @max=max(@max,$x); end{emitf @min, @max} ' همچنین برای اطلاعات بیشتر https://miller.readthedocs.io/reference-dsl را ببینید. .fi .if n \{\ .RE .SS "rank" .if n \{\ .RS 0 .\} .nf کاربرد: mlr rank [گزینه‌ها] برای مقدار هر رکورد در فیلدهای مشخص‌شده، رتبه رقابتی استاندارد (1,2,2,4,...) آن مقدار را در میان تمام رکوردهای ورودی، و به صورت اختیاری درون گروه‌ها، محاسبه می‌کند. به عنوان مثال با رکوردهای ورودی x=10، x=20، x=20 و x=30، رکوردهای خروجی زیر را منتشر می‌کند: x=10,x_rank=1 x=20,x_rank=2 x=20,x_rank=2 و x=30,x_rank=4. نکته: این الگوریتم به طور پیش‌فرض دو-گذره (two-pass) است: در گذر اول رکوردهای ورودی و مقادیر آن‌ها را نگه می‌دارد؛ در گذر دوم رتبه‌ها را محاسبه کرده و رکوردهای خروجی را به همان ترتیب ورودی اصلی منتشر می‌کند. این بدان معناست که تا خوانده شدن تمام ورودی هیچ خروجی‌ای تولید نمی‌کند، اما بدون توجه به ترتیب ورودی، رتبه‌های درستی ارائه می‌دهد. برای یک جایگزین جریانیِ تک-گذره از --sorted استفاده کنید. گزینه‌ها: -f {a,b,c} نام فیلد(ها) برای رتبه‌بندی. -g {d,e,f} نام فیلد(های) اختیاری برای گروه‌بندی (group-by). --sorted تضمین می‌دهد که ورودی از قبل بر اساس فیلد(های) در حال رتبه‌بندی مرتب شده است (درون هر گروه، در صورت مشخص شدن -g). این گزینه رتبه را در یک گذر جریانیِ تک و در فضای O(1) محاسبه می‌کند، با مقایسه مقدار هر رکورد تنها با رکورد دقیقاً قبلی، به جای بافر کردن همه رکوردها برای محاسبه رتبه مستقل از ترتیب. در صورتی که ورودی در واقع مرتب نشده باشد، خروجی نادرست تولید می‌کند. -h|--help نمایش این پیام. مثال: mlr rank -f x data/rank-example.csv مثال: mlr rank -f x -g g data/rank-example.csv مثال: mlr sort -f x then rank -f x --sorted data/rank-example.csv .fi .if n \{\ .RE.SS "regularize" .if n \{\ .RS 0 .\} .nf کاربرد: mlr regularize [گزینه‌ها] رکوردها را به‌ترتیب صعودی واژگانی بر اساس کلیدها در خروجی قرار می‌دهد. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "remove-empty-columns" .if n \{\ .RS 0 .\} .nf کاربرد: mlr remove-empty-columns [گزینه‌ها] فیلدهایی را که در تمام سطرهای ورودی خالی هستند حذف می‌کند. غیرجریانی (Non-streaming). گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "rename" .if n \{\ .RS 0 .\} .nf کاربرد: mlr rename [گزینه‌ها] {old1,new1,old2,new2,...} فیلدهای مشخص‌شده را تغییر نام می‌دهد. گزینه‌ها: -r در نظر گرفتن نام‌های قدیمی فیلد به عنوان عبارت‌های باقاعده. "ab" و "a.*b" به‌ترتیب با هر نام فیلدی که شامل زیررشته‌ی "ab" باشد یا با "a.*b" تطابق یابد، مطابقت خواهند داشت؛ لنگرهایی به فرم "^ab$" و "^a.*b$" قابل استفاده هستند. نام‌های جدید فیلد می‌توانند رشته‌های ساده باشند، یا حاوی گروه‌های ضبط به فرم "\e1" تا "\e9" باشند. قرار دادن عبارت باقاعده در گیومه دوتایی اختیاری است، اما اگر مایلید آن را با 'i' برای تعیین عدم حساسیت به بزرگی و کوچکی حروف دنبال کنید، الزامی است. -g انجام جایگزینی سراسری درون هر نام فیلد به‌جای جایگزینیِ نخستین تطابق. -h|--help نمایش این پیام. مثال‌ها: mlr rename old_name,new_name mlr rename old_name_1,new_name_1,old_name_2,new_name_2 mlr rename -r 'Date_[0-9]+,Date' تغییر نام تمام این‌گونه فیلدها به "Date" mlr rename -r '"Date_[0-9]+",Date' همانند بالا mlr rename -r 'Date_([0-9]+).*,\e1' تغییر نام تمام این فیلدها به قالبی مثل 20151015 mlr rename -r '"name"i,Name' تغییر نام "name" ،"Name" ،"NAME" و غیره به "Name" .fi .if n \{\ .RE .SS "reorder" .if n \{\ .RS 0 .\} .nf کاربرد: mlr reorder [گزینه‌ها] نام‌های مشخص‌شده را به ابتدا یا انتهای رکورد منتقل می‌کند. گزینه‌ها: -e قرار دادن نام‌های فیلد مشخص‌شده در انتهای رکورد: پیش‌فرض قرار دادن آن‌ها در ابتدای رکورد است. -f {a,b,c} نام‌های فیلدها برای تغییر ترتیب. -r {a,b,c} در نظر گرفتن نام‌های فیلد به عنوان عبارت‌های باقاعده. فیلدهای مطابقت‌یافته به ابتدا یا انتها منتقل می‌شوند، و بر اساس ترتیبی که عبارت‌های باقاعده داده شده‌اند دسته‌بندی می‌شوند؛ درون هر گروه، فیلدها ترتیب رکوردی خود را حفظ می‌کنند. مثال: -r '^YYY,^XXX' ابتدا تمام فیلدهای با پیشوند YYY، سپس تمام فیلدهای با پیشوند XXX، و بعد بقیه را قرار می‌دهد. -b {x} قرار دادن نام‌های فیلد مشخص‌شده با -f قبل از نام فیلد مشخص‌شده با {x}، در صورت وجود. اگر {x} در رکوردی موجود نباشد، فیلدهای مشخص‌شده منتقل نخواهند شد. -a {x} قرار دادن نام‌های فیلد مشخص‌شده با -f بعد از نام فیلد مشخص‌شده با {x}، در صورت وجود. اگر {x} در رکوردی موجود نباشد، فیلدهای مشخص‌شده منتقل نخواهند شد. -h|--help نمایش این پیام. مثال‌ها: mlr reorder -f a,b رکورد ورودی "d=4,b=2,a=1,c=3" را به "a=1,b=2,d=4,c=3" تبدیل می‌کند. mlr reorder -e -f a,b رکورد ورودی "d=4,b=2,a=1,c=3" را به "d=4,c=3,a=1,b=2" تبدیل می‌کند. mlr reorder -r '^YYY,^XXX' ابتدا فیلدهای با پیشوند YYY، سپس فیلدهای با پیشوند XXX و بعد بقیه را قرار می‌دهد. .fi .if n \{\ .RE .SS "repeat" .if n \{\ .RS 0 .\} .nf کاربرد: mlr repeat [گزینه‌ها] رکوردهای ورودی را چندین بار در رکوردهای خروجی کپی می‌کند. گزینه‌ها باید دقیقاً یکی از -n یا -f باشند. گزینه‌ها: -n {repeat count} تکرار هر رکورد ورودی به این تعداد دفعه. -f {field name} مشابه -n، اما تعداد تکرار را از نام فیلد مشخص‌شده‌ی هر رکورد ورودی می‌گیرد. -h|--help نمایش این پیام. مثال: echo x=0 | mlr repeat -n 4 then put '$x=urand()' تولید می‌کند: x=0.488189 x=0.484973 x=0.704983 x=0.147311 مثال: echo a=1,b=2,c=3 | mlr repeat -f b تولید می‌کند: a=1,b=2,c=3 a=1,b=2,c=3 مثال: echo a=1,b=2,c=3 | mlr repeat -f c تولید می‌کند: a=1,b=2,c=3 a=1,b=2,c=3 a=1,b=2,c=3 .fi .if n \{\ .RE .SS "reshape" .if n \{\ .RS 0 .\} .nf کاربرد: mlr reshape [گزینه‌ها] گزینه‌های تبدیل عریض به طولی: -i {input field names} -o {key-field name,value-field name} -r {input field regex} -o {key-field name,value-field name} این گزینه‌ها داده‌های ورودی را محوری/تغییر شکل می‌دهند به گونه‌ای که فیلدهای ورودی حذف شده و برای هر جفت کلید/مقدار، رکوردهای جداگانه‌ای صادر می‌شوند. نکته: اگر چندین عبارت باقاعده دارید، لطفاً آن‌ها را با چندین بار استفاده از -r مشخص کنید، چرا که عبارات باقاعده می‌توانند درون خود ویرگول داشته باشند. نکته: این حالت با tail -f کار می‌کند و به ازای هر رکورد ورودی مشاهده‌شده، رکوردهای خروجی تولید می‌نماید. اگر ورودی از `tail -f` دریافت می‌شود، حتماً از `--records-per-batch 1` استفاده کنید. گزینه‌های تبدیل طولی به عریض: -s {key-field name,value-field name} این گزینه داده‌های ورودی را برای بازگرداندن عملیات عریض به طولی، محوری/تغییر شکل می‌دهد. نکته: این حالت با tail -f کار نمی‌کند؛ و رکوردهای خروجی را تنها پس از خوانده شدن تمام رکوردهای ورودی تولید می‌نماید. گزینه‌ها: -i {input field names} نام‌های فیلد ورودی برای تغییر شکل عریض به طولی. همراه با -o استفاده شود. -r {input field regex} عبارت باقاعده فیلد ورودی برای تغییر شکل عریض به طولی. می‌تواند تکرار شود. همراه با -o استفاده شود. اگر چندین عبارت باقاعده دارید، لطفاً آن‌ها را با استفاده از چندین -r مشخص کنید، زیرا عبارات باقاعده می‌توانند حاوی ویرگول باشند. -o {key-field name,value-field name} نام‌های فیلد کلید و فیلد مقدار در خروجی برای تغییر شکل عریض به طولی. به -i یا -r نیاز دارد. -s {key-field name,value-field name} نام‌های فیلد کلید و فیلد مقدار برای تغییر شکل طولی به عریض. -h|--help نمایش این پیام. مثال‌ها: فایل ورودی "wide.txt": time X Y 2009-01-01 0.65473572 2.4520609 2009-01-02 -0.89248112 0.2154713 2009-01-03 0.98012375 1.3179287 mlr --pprint reshape -i X,Y -o item,value wide.txt time item value 2009-01-01 X 0.65473572 2009-01-01 Y 2.4520609 2009-01-02 X -0.89248112 2009-01-02 Y 0.2154713 2009-01-03 X 0.98012375 2009-01-03 Y 1.3179287 mlr --pprint reshape -r '[A-Z]' -o item,value wide.txt time item value 2009-01-01 X 0.65473572 2009-01-01 Y 2.4520609 2009-01-02 X -0.89248112 2009-01-02 Y 0.2154713 2009-01-03 X 0.98012375 2009-01-03 Y 1.3179287 فایل ورودی "long.txt": time item value 2009-01-01 X 0.65473572 2009-01-01 Y 2.4520609 2009-01-02 X -0.89248112 2009-01-02 Y 0.2154713 2009-01-03 X 0.98012375 2009-01-03 Y 1.3179287 mlr --pprint reshape -s item,value long.txt time X Y 2009-01-01 0.65473572 2.4520609 2009-01-02 -0.89248112 0.2154713 2009-01-03 0.98012375 1.3179287 همچنین ببینید: mlr nest. .fi .if n \{\ .RE.SS "sample" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sample [گزینه‌ها] نمونه‌برداری مخزنی (زیرنمونه‌گیری بدون جایگذاری)، اختیاری بر اساس دسته‌بندی. همچنین ببینید: mlr bootstrap و mlr shuffle. گزینه‌ها: -g {a,b,c} اختیاری: نام فیلدهای گروه‌بندی برای نمونه‌ها، مثلاً a,b,c. -k {k} اجباری: تعداد رکوردهای خروجی در مجموع، یا بر اساس گروه در صورت استفاده از -g. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "sec2gmtdate" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sec2gmtdate {فهرست نام‌های فیلد با کاما جدا شده} یک فیلد عددی نشان‌دهنده ثانیه‌های پس از مبدأ زمانی (epoch) را با برچسب زمانی متناظر سال-ماه-روز GMT جایگزین می‌کند؛ مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. این دستور صرفاً میانبری برای تابع sec2gmtdate است: mlr sec2gmtdate time1,time2 همانند دستور زیر است: mlr put '$time1=sec2gmtdate($time1);$time2=sec2gmtdate($time2)' گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "sec2gmt" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sec2gmt [گزینه‌ها] {فهرست نام‌های فیلد با کاما جدا شده} یک فیلد عددی نشان‌دهنده ثانیه‌های پس از مبدأ زمانی (epoch) را با برچسب زمانی متناظر GMT جایگزین می‌کند؛ مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. این دستور صرفاً میانبری برای تابع sec2gmt است: mlr sec2gmt time1,time2 همانند دستور زیر است: mlr put '$time1 = sec2gmt($time1); $time2 = sec2gmt($time2)' گزینه‌ها: -1 قالب‌بندی ثانیه‌ها با ۱ رقم اعشار. -2 قالب‌بندی ثانیه‌ها با ۲ رقم اعشار. -3 قالب‌بندی ثانیه‌ها با ۳ رقم اعشار. -4 قالب‌بندی ثانیه‌ها با ۴ رقم اعشار. -5 قالب‌بندی ثانیه‌ها با ۵ رقم اعشار. -6 قالب‌بندی ثانیه‌ها با ۶ رقم اعشار. -7 قالب‌بندی ثانیه‌ها با ۷ رقم اعشار. -8 قالب‌بندی ثانیه‌ها با ۸ رقم اعشار. -9 قالب‌بندی ثانیه‌ها با ۹ رقم اعشار. --millis اعداد ورودی به عنوان میلی‌ثانیه پس از مبدأ زمانی (epoch) در نظر گرفته می‌شوند. --micros اعداد ورودی به عنوان میکروثانیه پس از مبدأ زمانی (epoch) در نظر گرفته می‌شوند. --nanos اعداد ورودی به عنوان نانوثانیه پس از مبدأ زمانی (epoch) در نظر گرفته می‌شوند. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "seqgen" .if n \{\ .RS 0 .\} .nf کاربرد: mlr seqgen [گزینه‌ها] توالی‌ای از شمارنده‌ها تولید می‌کند. جریان رکوردهای ورودی را نادیده می‌گیرد. خروجی را مطابق با گزینه‌های مشخص‌شده تولید می‌کند. گزینه‌ها: -f {name} نام فیلد برای شمارنده‌ها. پیش‌فرض: "i". --start {value} مقدار شروع (شامل خود مقدار). پیش‌فرض: 1. --step {value} مقدار گام. پیش‌فرض: 1. می‌تواند منفی باشد اما صفر نیست (مگر این‌که start == stop باشد). --stop {value} مقدار پایان (شامل خود مقدار). پیش‌فرض: 100. -h|--help نمایش این پیام. مقادیر start،‏ stop و/یا step می‌توانند ممیز شناور باشند. خروجی در صورتی که start، stop و step همگی عدد صحیح باشند، عدد صحیح خواهد بود. مقدار step می‌تواند منفی باشد. این مقدار نمی‌تواند صفر باشد مگر این‌که start == stop باشد. .fi .if n \{\ .RE .SS "shuffle" .if n \{\ .RS 0 .\} .nf کاربرد: mlr shuffle [گزینه‌ها] رکوردها را با جایگشت تصادفی در خروجی قرار می‌دهد. تا زمانی که همه رکوردهای ورودی خوانده نشوند، هیچ رکورد خروجی تولید نمی‌شود. همچنین ببینید: mlr bootstrap و mlr sample. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "skip-trivial-records" .if n \{\ .RS 0 .\} .nf کاربرد: mlr skip-trivial-records [گزینه‌ها] تمام رکوردها را عبور می‌دهد، به جز رکوردهایی با صفر فیلد، یا رکوردهایی که تمام فیلدهای آن‌ها مقدار خالی دارند. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "sort" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sort {پرچم‌ها} رکوردها را در درجه اول بر اساس نخستین فیلد مشخص‌شده، در درجه دوم بر اساس دومین فیلد و به همین ترتیب مرتب می‌کند. (هر رکوردی که دارای تمام کلیدهای مرتب‌سازی مشخص‌شده نباشد، در انتهای خروجی و به همان ترتیبی که دریافت شده است، بدون توجه به ترتیب مرتب‌سازی مشخص‌شده، قرار خواهد گرفت.) مرتب‌سازی پایدار (stable) است: رکوردهایی که مقدار یکسانی دارند، به ترتیبی که در جریان رکوردهای ورودی دریافت شده‌اند مرتب خواهند شد. گزینه‌ها: -f {a,b,c} مرتب‌سازی الفبایی صعودی روی نام‌های فیلد مشخص‌شده. -r {a,b,c} مرتب‌سازی الفبایی نزولی روی نام‌های فیلد مشخص‌شده. -c {a,b,c} مرتب‌سازی الفبایی صعودی بدون حساسیت به حروف بزرگ و کوچک روی فیلدهای مشخص‌شده. -cr {a,b,c} مرتب‌سازی الفبایی نزولی بدون حساسیت به حروف بزرگ و کوچک روی فیلدهای مشخص‌شده. -n {a,b,c} مرتب‌سازی عددی صعودی روی نام‌های فیلد مشخص‌شده؛ مقادیر null در آخر قرار می‌گیرند. -nf {a,b,c} مشابه -n. -nr {a,b,c} مرتب‌سازی عددی نزولی روی نام‌های فیلد مشخص‌شده؛ مقادیر null در ابتدا قرار می‌گیرند. -t {a,b,c} مرتب‌سازی طبیعی (natural) صعودی روی نام‌های فیلد مشخص‌شده. -b انتقال فیلدهای مرتب‌سازی به ابتدای رکورد، مانند دستور reorder -b. -tr|-rt {a,b,c} مرتب‌سازی طبیعی نزولی روی نام‌های فیلد مشخص‌شده. -h|--help نمایش این پیام. مثال: mlr sort -f a,b -nr x,y,z که همانند دستور زیر است: mlr sort -f a -f b -nr x -nr y -nr z .fi .if n \{\ .RE.SS "sort-within-records" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sort-within-records [گزینه‌ها] رکوردهایی را که بر اساس کلیدها به صورت لغوی صعودی مرتب شده‌اند خروجی می‌دهد. گزینه‌ها: -f {names} تنها مرتب‌سازی این کلیدها؛ بقیه ترتیب رکورد را حفظ می‌کنند. -r {regex} تنها مرتب‌سازی کلیدهای منطبق بر این regex؛ بقیه ترتیب رکورد را حفظ می‌کنند. مثال: -r '^[xy]' کلیدهایی را که با x یا y شروع می‌شوند مرتب می‌کند. بدون آرگومان regex، گزینه -r زیرشیءها/زیرنگاشت‌ها را به صورت بازگشتی مرتب می‌کند (مثلاً برای ورودی JSON)، یا با -f ترکیب می‌شود تا نام‌ها به عنوان regex در نظر گرفته شوند. -n مرتب‌سازی نام فیلدها به صورت طبیعی (مثلاً 2 قبل از 12). قابل ترکیب با -f/-r. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "sparkline" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sparkline [گزینه‌ها] یک یا چند فیلد عددی را، در سرتاسر همه رکوردها به ترتیب ورودی، به یک sparkline یونیکد فشرده -- یک نویسه بلوکی برای هر رکورد -- جهت مصورسازی روندها خلاصه می‌کند. به ازای هر فیلد یک رکورد خروجی صادر می‌کند. پیش از تولید هرگونه خروجی، تمام رکوردها را در حافظه نگه می‌دارد. گزینه‌ها: -f {a,b,c} نام فیلدها برای ایجاد sparkline. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "sparsify" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sparsify [گزینه‌ها] فیلدهایی را که کلید آن‌ها رشته خالی است (یا به صورت اختیاری، یک مقدار مشخص‌شده دیگر) حذف می‌کند. تنها در صورتی منطقی است که قالب خروجی CSV یا TSV نباشد. گزینه‌ها: -s {filler string} چه مقادیری حذف شوند. پیش‌فرض رشته خالی است. -f {a,b,c} مشخص کردن نام فیلدهایی که باید پردازش شوند؛ فیلدهای دیگر تغییر نخواهند کرد. حالت پیش‌فرض، تغییر تمام فیلدها است. -h|--help نمایش این پیام. مثال: اگر ورودی a=1,b=,c=3 باشد، خروجی a=1,c=3 خواهد بود. .fi .if n \{\ .RE .SS "split" .if n \{\ .RS 0 .\} .nf کاربرد: mlr split [گزینه‌ها] {filename} گزینه‌ها: -n {n} محدود کردن اندازه فایل‌های خروجی به N رکورد. -m {m} تولید M فایل، با توزیع نوبتی (round-robin) رکوردها میان آن‌ها. -g {a,b,c} نوشتن فایل‌های مجزا با رکوردهایی که مقادیر متمایزی برای نام فیلدهای مشخص‌شده دارند. --prefix {p} پیشوند نام فایل خروجی. پیش‌فرض "split". --suffix {s} پسوند نام فایل خروجی. پیش‌فرض بر اساس قالب خروجی است، مثلاً "csv". --folder {f} دایرکتوری خروجی. پیش‌فرض دایرکتوری جاری است. -a الحاق به فایل‌های موجود به جای رونویسی آن‌ها. -v ارسال رکوردها به خروجی جریان پایین‌دستی (downstream) علاوه بر تقسیم به فایل‌ها. -e عدم استفاده از URL-escape برای نام فایل‌های خروجی. -j {J} رشته مورد استفاده برای اتصال بخش‌های نام فایل. پیش‌فرض "_". -h|--help نمایش این پیام. دقیقاً باید یکی از گزینه‌های -m، -n، یا -g مشخص شود. هر یک از پرچم‌های خط فرمان مربوط به قالب خروجی (به mlr -h رجوع کنید). برای مثال، با استفاده از: mlr --icsv --from myfile.csv split --ojson -n 1000 ورودی CSV است، اما فایل‌های خروجی JSON خواهند بود. مثال‌ها: فرض کنید myfile.csv دارای ۱٬۰۰۰٬۰۰۰ رکورد باشد. ۱۰۰ فایل خروجی، هر کدام ۱۰٬۰۰۰ رکورد. ۱۰٬۰۰۰ رکورد اول در split_1.csv، بعدی‌ها در split_2.csv و غیره. mlr --csv --from myfile.csv split -n 10000 ۱۰ فایل خروجی، هر کدام ۱۰۰٬۰۰۰ رکورد. رکوردهای ۱، ۱۱، ۲۱ و غیره در split_1.csv، رکوردهای ۲، ۱۲، ۲۲ و غیره در split_2.csv و غیره. mlr --csv --from myfile.csv split -m 10 مشابه، اما با خروجی JSON. mlr --csv --from myfile.csv split -m 10 -o json مشابه، اما به جای split_1.csv، split_2.csv و غیره، فایل‌های test_1.dat، test_2.dat و غیره تولید شوند. mlr --csv --from myfile.csv split -m 10 --prefix test --suffix dat مشابه، اما نوشته‌شده در دایرکتوری /tmp/. mlr --csv --from myfile.csv split -m 10 --prefix /tmp/test --suffix dat یا با استفاده از --folder: mlr --csv --from myfile.csv split -m 10 --folder /tmp --prefix test --suffix dat اگر فیلد shape دارای مقادیر triangle و square باشد، فایل‌های split_triangle.csv و split_square.csv ایجاد خواهند شد. mlr --csv --from myfile.csv split -g shape اگر فیلد color دارای مقادیر yellow و green، و فیلد shape دارای مقادیر triangle و square باشد، فایل‌های split_yellow_triangle.csv، split_yellow_square.csv و غیره ایجاد خواهند شد. mlr --csv --from myfile.csv split -g color,shape همچنین تابع DSL به نام "tee" را ببینید که امکان سفارشی‌سازی‌های موردی بیشتری را فراهم می‌کند. .fi .if n \{\ .RE .SS "ssub" .if n \{\ .RS 0 .\} .nf کاربرد: mlr ssub [گزینه‌ها] رشته قدیمی را با رشته جدید در فیلد(های) مشخص‌شده جایگزین می‌کند، بدون پشتیبانی از regex برای رشته قدیمی، مانند تابع DSL با نام `ssub`. هر دو رشته جستجو و جایگزینی از نویسه‌های گریز بک‌اسلش به سبک C مانند \en، \et، و \ex1f پشتیبانی می‌کنند. برای درج یک بک‌اسلش واقعی \e\e را بنویسید. همچنین فعل‌های `gsub` و `sub` را ببینید. گزینه‌ها: -f {a,b,c} نام فیلدهایی که جایگزینی روی آن‌ها اعمال شود. -r {regex} عبارت باقاعده برای نام فیلدهایی که جایگزینی روی آن‌ها اعمال شود. -a اعمال جایگزینی بر روی تمام فیلدها. -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "stats1" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr stats1 [گزینه‌ها] محاسبه آماره‌های تک‌متغیره برای یک یا چند فیلد مشخص‌شده، به‌صورت تجمیعی روی جریان رکوردهای ورودی. گزینه‌ها: -a {sum,count,...} نام‌های تجمیع‌کننده‌ها: یک یا چند مورد از مقادیر فهرست‌شده. همچنین median (معادل p50) و صدک‌های p{n} را برای n در بازه 0..100 می‌پذیرد، مانند p10 p25.2 p50 p98 p100. -f {a,b,c} نام فیلدهای مقداری که آماره‌ها روی آن‌ها محاسبه می‌شوند. --fr {regex} عبارت باقاعده برای نام فیلدهای مقداری مورد محاسبه (محاسبه آماره‌ها روی مقادیر در تمام نام فیلدهای منطبق بر regex). --fx {regex} عبارت باقاعده معکوس برای نام فیلدهای مقداری مورد محاسبه (محاسبه آماره‌ها روی مقادیر در تمام نام فیلدهای غیرمنطبق بر regex). -g {d,e,f} نام‌های اختیاری فیلدها برای گروه‌بندی (group-by). --gr {regex} عبارت باقاعده برای نام‌های اختیاری فیلدهای گروه‌بندی (گروه‌بندی بر اساس مقادیر در نام فیلدهای منطبق بر regex). --gx {regex} عبارت باقاعده معکوس برای نام‌های اختیاری فیلدهای گروه‌بندی (گروه‌بندی بر اساس مقادیر در نام فیلدهای غیرمنطبق بر regex). --grfx {regex} میان‌بری برای --gr {regex} --fx {همان regex}. -i استفاده از صدک‌های درون‌یابی‌شده، مانند type=7 در زبان R؛ پیش‌فرض مانند type=1 است. برای فیلدهای با مقادیر رشته‌ای بی‌معنی است. -s چاپ آماره‌های تکرارشونده. در زمینه‌های tail -f مفید است، که در این حالت لطفاً از خروجی pprint پرهیز کنید زیرا انتهای جریان ورودی هرگز دیده نخواهد شد. به‌همین ترتیب، اگر ورودی از `tail -f` می‌آید حتماً از `--records-per-batch 1` استفاده کنید. -w {n} حالت پنجره لغزان: محاسبه آماره‌ها روی پنجره‌ای متحرک شامل حداکثر n رکورد قبلی (شامل رکورد فعلی)، به جای کل جریان رکوردها. هنگام استفاده از -g، پنجره‌ها به ازای هر گروه نگهداری می‌شوند. به ازای هر رکورد ورودی یک رکورد خروجی تولید شده که آماره‌های پنجره‌ای به آن الحاق شده است. با -s سازگار نیست. -S پرچم بدون‌عملیات برای سازگاری عقروعلی با Miller 5. -F پرچم بدون‌عملیات برای سازگاری عقروعلی با Miller 5. -h|--help نمایش این پیام. نام‌های تجمیع‌کننده‌ها برای -a، یک یا چند مورد از: median این مقدار معادل p50 است p10 p25.2 p50 p98 p100 غیره count شمارش تعداد تکرار فیلدها null_count شمارش تعداد موارد رشته‌خالی/JSON-null در هر فیلد distinct_count شمارش تعداد مقادیر متمایز در هر فیلد mode یافتن پرتکرارترین مقادیر برای فیلدها؛ در برابری، نخستین مورد یافت‌شده برنده است antimode یافتن کم‌تکرارترین مقادیر برای فیلدها؛ در برابری، نخستین مورد یافت‌شده برنده است sum محاسبه مجموع فیلدهای مشخص‌شده mean محاسبه میانگین‌ها (میانگین نمونه) فیلدهای مشخص‌شده mad محاسبه انحراف میانگین مطلق (MAD) var محاسبه واریانس نمونه فیلدهای مشخص‌شده stddev محاسبه انحراف معیار نمونه فیلدهای مشخص‌شده meaneb تخمین خطاهای میانگین (با فرض عدم وجود خودهمبستگی نمونه) skewness محاسبه چولگی نمونه فیلدهای مشخص‌شده kurtosis محاسبه کشیدگی نمونه فیلدهای مشخص‌شده min محاسبه مقادیر کمینه فیلدهای مشخص‌شده max محاسبه مقادیر بیشینه فیلدهای مشخص‌شده minlen محاسبه حداقل طول رشته فیلدهای مشخص‌شده maxlen محاسبه حداکثر طول رشته فیلدهای مشخص‌شده مثال: mlr stats1 -a min,p10,p50,p90,max -f value -g size,shape مثال: mlr stats1 -a count,mode -f size مثال: mlr stats1 -a count,mode -f size -g shape مثال: mlr stats1 -a mean,min,max -f quantity -g name -w 7 این دستور به ازای هر رکورد ورودی یک رکورد خروجی صادر می‌کند، با آماره‌های پنجره لغزان روی حداکثر ۷ رکورد آخر برای هر name. مثال: mlr stats1 -a count,mode --fr '^[a-h].*$' --gr '^k.*$' این دستور آماره‌های count و mode را روی تمام نام فیلدهایی که با حروف a تا h شروع می‌شوند، با گروه‌بندی بر اساس تمام نام فیلدهایی که با k شروع می‌شوند، محاسبه می‌کند. نکات: * p50 و median مترادف هستند. * min و max به ترتیب نتایجی مشابه p0 و p100 خروجی می‌دهند، اما حافظه کمتری مصرف می‌کنند. * داده‌های رشته‌ای معتبر هستند مگر آنکه محاسبات حسابی روی آن‌ها مورد نیاز باشد، مانند sum ،mean، صدک‌های درون‌یابی‌شده و غیره. در صورت وجود داده‌های ترکیبی، اعداد کوچکتر از رشته‌ها در نظر گرفته می‌شوند. * گزینه‌های count و mode ورودی متنی را می‌پذیرند؛ بقیه موارد به ورودی عددی نیاز دارند. به‌ویژه، 1 و 1.0 در count و mode دو متن متمایز تلقی می‌شوند. * هنگامی که در mode برابری رخ دهد، نخستین داده مشاهده‌شده انتخاب می‌شود. .fi .if n \{\ .RE .SS "stats2" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr stats2 [گزینه‌ها] محاسبه آماره‌های دومتغیره برای یک یا چند جفت‌نام فیلد مشخص‌شده، به‌صورت تجمیعی روی جریان رکوردهای ورودی. گزینه‌ها: -a {linreg-ols,corr,...} نام‌های تجمیع‌کننده‌ها: یک یا چند مورد از مقادیر فهرست‌شده. -f {a,b,c,d} جفت‌نام‌های فیلدهای مقداری که آماره‌ها روی آن‌ها محاسبه می‌شوند. تعداد نام‌ها باید زوج باشد. -g {e,f,g} نام‌های اختیاری فیلدها برای گروه‌بندی (group-by). -v چاپ خروجی اضافی برای linreg-pca. -s چاپ آماره‌های تکرارشونده. در زمینه‌های tail -f مفید است، که در این حالت لطفاً از خروجی با قالب pprint پرهیز کنید زیرا انتهای جریان ورودی هرگز دیده نخواهد شد. به‌همین ترتیب، اگر ورودی از `tail -f` می‌آید، حتماً از `--records-per-batch 1` استفاده کنید. --fit به‌جای چاپ پارامترهای رگرسیون، آن‌ها را برای محاسبه فیلدهای برازش‌شده جدید بر داده‌های ورودی اعمال می‌کند. تمام رکوردهای ورودی تا پایان جریان ورودی در حافظه نگه‌داشته می‌شوند. تنها برای linreg-ols ،linreg-pca و logireg اثرگذار است. -S پرچم بدون‌عملیات برای سازگاری عقروعلی با Miller 5. -F پرچم بدون‌عملیات برای سازگاری عقروعلی با Miller 5. -h|--help نمایش این پیام. نام‌های تجمیع‌کننده‌ها برای -a، یک یا چند مورد از: linreg-ols رگرسیون خطی با استفاده از حداقل مربعات معمولی (OLS) linreg-pca رگرسیون خطی با تحلیل مؤلفه‌های اصلی (PCA) r2 معیار کیفیت برای linreg-ols (دستور linreg-pca معیار ویژه خود را خروجی می‌دهد) logireg رگرسیون لجستیک corr همبستگی نمونه cov کوواریانس نمونه covx ماتریس کوواریانس نمونه تنها یکی از دو گزینه -s یا --fit می‌تواند استفاده شود. مثال: mlr stats2 -a linreg-pca -f x,y مثال: mlr stats2 -a linreg-ols,r2 -f x,y -g size,shape مثال: mlr stats2 -a corr -f x,y .fi .if n \{\ .RE.SS "step" .if n \{\ .RS 0 .\} .nf کاربرد: mlr step [گزینه‌ها] محاسبه مقادیر وابسته به رکوردهای قبلی/بعدی، به صورت اختیاری گروه‌بندی‌شده بر اساس دسته‌بندی. گزینه‌ها: -a {delta,rsum,...} نام‌های گام‌سازها: جداشده با کاما، یک یا چند مورد از مقادیر فهرست‌شده. -f {a,b,c} نام فیلدهای مقداری که آمار روی آن‌ها محاسبه می‌شود. -g {d,e,f} نام فیلدهای اختیاری گروه‌بندی (group-by). -F محاسبه مقادیر صحیح‌پذیر (مانند counter) در قالب ممیز شناور. از Miller 6 این مورد به طور خودکار رخ می‌دهد، اما این پرچم برای سازگاری عقبروی با Miller 5 و نسخه‌های پایین‌تر به عنوان no-op پذیرفته می‌شود. -d {x,y,z} وزن‌ها برای EWMA. مقدار 1 یعنی نمونه فعلی تمام وزن را می‌گیرد (بدون هموارسازی)، مقادیر نزدیک به زیر 1 هموارسازی سبک و نزدیک به بالای 0 هموارسازی شدید است. می‌توان چند وزن تعیین کرد، مانند: "mlr step -a ewma -f sys_load -d 0.01,0.1,0.9". پیش‌فرض در صورت حذف، "-d 0.5" است. -o {a,b,c} پسوندهای سفارشی برای فیلدهای خروجی EWMA. در صورت عدم درج، پیش‌فرض آن‌ها مقادیر -d است. در صورت ارائه، تعداد مقادیر -o باید با تعداد مقادیر -d یکسان باشد. -h|--help نمایش این پیام. نام‌های گام‌سازها برای -a، جداشده با کاما، یک یا چند مورد از: counter شمارش نمونه‌های فیلد(ها) بین رکوردهای متوالی delta محاسبه تفاوت‌ها در فیلد(ها) بین رکوردهای متوالی. استفاده از delta یا معادل آن delta_1 برای رکورد قبلی، یا delta_{n} برای n رکورد قبل‌تر. ewma میانگین متحرک وزندار نمایی روی رکوردهای متوالی from-first محاسبه تفاوت‌ها در فیلد(ها) نسبت به رکورد نخست ratio محاسبه نسبت‌ها در فیلد(ها) بین رکوردهای متوالی. استفاده از ratio یا معادل آن ratio_1 برای رکورد قبلی، یا ratio_{n} برای n رکورد قبل‌تر. rprod محاسبه حاصل‌ضرب‌های تجمعی فیلد(ها) بین رکوردهای متوالی rsum محاسبه مجموع‌های تجمعی فیلد(ها) بین رکوردهای متوالی shift نام مستعار برای shift_lag. استفاده از shift یا معادل آن shift_1 برای رکورد قبلی، یا shift_{n} برای n رکورد قبل‌تر. shift_lag گنجاندن مقدار(های) فیلد(ها) از رکورد قبلی، در صورت وجود. استفاده از shift_lag یا معادل آن shift_lag_1 برای رکورد قبلی، یا shift_lag_{n} برای n رکورد قبل‌تر. shift_lead گنجاندن مقدار(های) فیلد(ها) از رکورد بعدی، در صورت وجود. استفاده از shift_lead یا معادل آن shift_lead_1 برای رکورد بعدی، یا shift_lead_{n} برای n رکورد جلوتر. slwin میانگین‌های پنجره لغزان روی m رکورد قبل‌تر و n رکورد جلوتر. مانند slwin_7_2 برای ۷ رکورد قبل و ۲ رکورد جلو. مثال‌ها: mlr step -a rsum -f request_size mlr step -a delta -f request_size -g hostname mlr step -a ewma -d 0.1,0.9 -f x,y mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y -g group_name mlr step -a slwin_9_0,slwin_0_9 -f x mlr step -a shift_lag_12 -f sales گام‌سازهای shift، shift_lag، shift_lead، delta و ratio یک شمارش اختیاری در انتها را می‌پذیرند: shift_lag_{n} به n رکورد قبل‌تر اشاره دارد و shift_lead_{n} به n رکورد جلوتر اشاره می‌کند. حالت‌های ساده معادل شمارش ۱ هستند: مثلاً shift_lag همانند shift_lag_1 است. برای اطلاعات بیشتر درباره EWMA لطفاً به https://miller.readthedocs.io/en/latest/reference-verbs.html#filter یا https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average مراجعه کنید. .fi .if n \{\ .RE .SS "sub" .if n \{\ .RS 0 .\} .nf کاربرد: mlr sub [گزینه‌ها] جایگزینی رشته قدیمی با رشته جدید در فیلد(های) مشخص‌شده، با پشتیبانی از عبارت باقاعده (regex) برای رشته قدیمی و بدون مدیریت تطابق‌های چندگانه، مانند تابع DSL با نام `sub`. رشته جایگزین از گریزهای بک‌اسلش به سبک C مانند \en، \et و \ex1f پشتیبانی می‌کند. برای داشتن بک‌اسلش واقعی، \e\e را بنویسید. همچنین دستورهای `gsub` و `ssub` را ببینید. گزینه‌ها: -f {a,b,c} نام فیلدهایی که جایگزینی روی آن‌ها اعمال می‌شود. -r {regex} عبارت باقاعده برای نام فیلدهایی که جایگزینی روی آن‌ها اعمال می‌شود. -a اعمال جایگزینی روی تمام فیلدها. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "summary" .if n \{\ .RS 0 .\} .nf کاربرد: mlr summary [گزینه‌ها] نمایش آمارهای خلاصه درباره داده‌های ورودی. تمام خلاصه‌سازها: field_type string، int و غیره \-\- اگر یک ستون انواع مختلف داشته باشد، تمام انواع دیده‌شده چاپ می‌شوند (یادداشت‌های زیر را ببینید) count +1 برای هر نمونه از فیلد در تمام رکوردهای جریان رکورد ورودی null_count تعداد مقادیر فیلد که رشته خالی یا JSON null هستند distinct_count تعداد مقادیر متمایز برای فیلد mode پرتکرارترین مقدار برای فیلد sum مجموع مقادیر فیلد mean میانگین مقادیر فیلد stddev انحراف معیار مقادیر فیلد var واریانس مقادیر فیلد skewness چولگی مقادیر فیلد minlen طول کوتاه‌ترین بازنمایی رشته‌ای برای فیلد maxlen طول بلندترین بازنمایی رشته‌ای برای فیلد min حداقل مقدار فیلد p25 مقدار چارک اول فیلد median مقدار میانه فیلد p75 مقدار چارک سوم فیلد max حداکثر مقدار فیلد iqr دامنه میان‌چارکی: p75 - p25 lof کران بیرونی پایینی: p25 - 3.0 * iqr lif کران درونی پایینی: p25 - 1.5 * iqr uif کران درونی بالایی: p75 + 1.5 * iqr uof کران بیرونی بالایی: p75 + 3.0 * iqr خلاصه‌سازهای پیش‌فرض: field_type count mean min max null_count distinct_count یادداشت‌ها: * مقادیر min، p25، median، p75 و max هم برای رشته‌ها و هم برای اعداد کار می‌کنند * شمارش مقادیر متمایز بر اساس بازنمایی رشته‌ای محاسبه می‌شود \-\- بنابراین 4.1 و 4.10 در اینجا متمایز شمرده می‌شوند. * اگر mode در داده‌های ورودی یکتا نباشد، نخستین مقدار مشاهده‌شده به عنوان mode گزارش می‌شود. * مقدار field_type به صورت "int-string" یا "empty-string" و غیره به این معناست که ستون شامل مقادیری از انواع ترکیبی است \-\- تمام انواع دیده‌شده به ترتیبی که نخستین بار مشاهده شدند، متصل با خط تیره چاپ می‌شوند. گزینه‌ها: -a {mean,sum,etc.} فقط استفاده از خلاصه‌سازهای مشخص‌شده. -x {mean,sum,etc.} استفاده از تمام خلاصه‌سازها به جز موارد مشخص‌شده. --all استفاده از تمام خلاصه‌سازهای موجود. --transpose نمایش خروجی با نام فیلدها به عنوان نام ستون‌ها. -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "surv" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr surv -d {duration-field} -s {status-field} تخمین منحنی بقای کاپلان-مایر (سانسورشده از راست). گزینه‌ها: -d {field} نام فیلد مدت‌زمان (زمان تا رخداد یا سانسور). -s {field} نام فیلد وضعیت (0=سانسورشده، 1=رخداد). -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "tac" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr tac [گزینه‌ها] رکوردها را به ترتیبی معکوس نسبت به ترتیبی که دریافت شده‌اند چاپ می‌کند. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "tail" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr tail [گزینه‌ها] n رکورد آخر را عبور می‌دهد، به صورت اختیاری بر اساس دسته‌بندی. گزینه‌ها: -g {a,b,c} نام‌های اختیاری فیلدهای گروه‌بندی برای شمارش‌های tail، مانند a,b,c. -n {n} تعداد رکوردهای پایانی برای چاپ. پیش‌فرض 10. وجود علامت '+' در ابتدا به معنای شروع از رکورد n-اُم به جای چاپ n رکورد آخر است: به عنوان مثال -n +3 همه رکوردها به جز ۲ رکورد اول را عبور می‌دهد، به صورت اختیاری بر اساس دسته‌بندی. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "tee" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr tee [گزینه‌ها] {filename} گزینه‌ها: -a الحاق به فایل موجود، در صورت وجود، به جای رونویسی روی آن. -p در نظر گرفتن filename به عنوان یک دستور پایپ (pipe-to). -h|--help نمایش این پیام. هر یک از پرچم‌های خط فرمان مربوط به قالب خروجی (نگاه کنید به mlr -h). مثال: با استفاده از mlr --icsv --opprint put '...' then tee --ojson ./mytap.dat then stats1 ... ورودی CSV است، خروجی به صورت جدول خوانا (pretty-print) است، اما خروجی tee-file در قالب JSON نوشته می‌شود. .fi .if n \{\ .RE .SS "template" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr template [گزینه‌ها] فیلدهای رکورد ورودی را به ترتیبی که در فهرست نام ستون‌ها مشخص شده قرار می‌دهد. اگر رکورد ورودی فاقد یک فیلد مشخص‌شده باشد، با مقدار fill-with پر خواهد شد. اگر رکورد ورودی فیلدی داشته باشد که مشخص نشده است، دور انداخته می‌شود. گزینه‌ها: -f {a,b,c} نام فیلدهای جداشده با کاما برای الگو، مانند a,b,c. -t {filename} فایل CSV که خط سرایند آن برای الگو استفاده خواهد شد. --fill-with {filler string} مقداری که برای پر کردن فیلدهای غایب استفاده می‌شود. پیش‌فرض رشته خالی است. -h|--help نمایش این پیام. مثال: * فیلدهای مشخص‌شده عبارتند از a,b,c. * رکورد ورودی c=3,a=1,f=6 است. * رکورد خروجی a=1,b=,c=3 است. .fi .if n \{\ .RE .SS "top" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr top [گزینه‌ها] گزینه‌ها: -f {a,b,c} نام‌های فیلد مقدار برای شمارش مقادیر برتر. -g {d,e,f} نام‌های اختیاری فیلدهای گروه‌بندی برای شمارش مقادیر برتر. -n {count} تعداد رکوردهایی که برای هر دسته چاپ می‌شوند؛ پیش‌فرض 1. -a چاپ تمام فیلدها برای رکوردهای با مقادیر برتر؛ پیش‌فرض تنها چاپ فیلدهای مقدار و گروه‌بندی است. تنها به یک نام فیلد مقدار نیاز دارد. --max چاپ بزرگ‌ترین مقادیر برتر. این حالت پیش‌فرض است. --min چاپ کوچک‌ترین مقادیر برتر؛ پیش‌فرض بزرگ‌ترین مقادیر برتر است. -F نگه‌داشتن مقادیر برتر به صورت اعشاری حتی اگر شبیه عدد صحیح باشند (در Miller 6 نادیده گرفته می‌شود، برای سازگاری با نسخه‌های پیشین حفظ شده است). -o {name} نام فیلد برای اندیس‌های خروجی. پیش‌فرض "top_idx". در صورت استفاده از -a نادیده گرفته می‌شود. -h|--help نمایش این پیام. n رکورد با کوچک‌ترین/بزرگ‌ترین مقادیر را در فیلدهای مشخص‌شده چاپ می‌کند، به صورت اختیاری بر اساس دسته‌بندی. اگر -a مشخص شود، رکوردهای برتر با همان فیلدهایی که در ورودی ظاهر شده‌اند خارج می‌شوند. بدون -a، تنها فیلدهای مربوط به -f، فیلدهای -g و فیلد top-index خارج می‌شوند. برای اطلاعات بیشتر لطفاً https://miller.readthedocs.io/en/latest/reference-verbs#top را ببینید .fi .if n \{\ .RE .SS "utf8-to-latin1" .if n \{\ .RS 0 .\} .nf نحوه استفاده: mlr utf8-to-latin1، بدون هیچ گزینه‌ای. رشته‌های رکورد را به صورت بازگشتی از UTF-8 به Latin-1 تبدیل می‌کند. برای کنترل در سطح فیلد، لطفاً تابع DSL به نام utf8_to_latin1 را ببینید. گزینه‌ها: -h|--help نمایش این پیام. .fi .if n \{\ .RE.SS "unflatten" .if n \{\ .RS 0 .\} .nf کاربرد: mlr unflatten [گزینه‌ها] عملیات flatten را معکوس می‌کند. مثال: فیلدی با نام 'a.b.c' و مقدار 4 به نام 'a' و مقدار '{"b": { "c": 4 }}' تبدیل می‌شود. گزینه‌ها: -f {a,b,c} فهرست جداشده با کاما از نام فیلدها برای unflatten (پیش‌فرض همه). -s {string} جداکننده، به صورت پیش‌فرض برابر با مقدار mlr --flatsep. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "uniq" .if n \{\ .RS 0 .\} .nf کاربرد: mlr uniq [گزینه‌ها] مقادیر متمایز را برای نام‌های فیلد مشخص‌شده چاپ می‌کند. با -c، مشابه count-distinct عمل می‌کند. برای uniq، گزینه -f مترادفی برای -g است. فیلدهای خروجی به ترتیبی که با -g یا -f نام‌گذاری شده‌اند نوشته می‌شوند، نه به ترتیبی که در رکوردهای ورودی ظاهر شده‌اند. برای حذف رکوردهای تکراری بر اساس یک یا چند فیلد در عین حفظ تمام فیلدهای دیگر، از head استفاده کنید: برای مثال "mlr head -n 1 -g hash" اولین رکورد را برای هر مقدار متمایز از فیلد hash، در حالی که تمام فیلدها دست‌نخورده باقی می‌مانند، نگه می‌دارد. گزینه‌ها: -g {d,e,f} نام فیلدهای گروه‌بندی (Group-by) برای شمارش‌های uniq. -f {d,e,f} مترادفی برای -g. -x {a,b,c} نام فیلدهایی برای مستثنی کردن از uniq؛ در عوض از سایر فیلدهای هر رکورد استفاده می‌شود. -c نمایش تعداد تکرار علاوه بر مقادیر یکتا. -n نمایش تنها تعداد مقادیر متمایز. -o {name} نام فیلد برای شمارش خروجی. پیش‌فرض "count". -a خروجی دادن هر رکورد یکتا فقط یک‌بار. ناسازگار با -g. همراه با -c، رکوردهای یکتا را به همراه تعداد تکرار هرکدام تولید می‌کند. همراه با -n، تنها یک رکورد تولید می‌کند که تعداد رکوردهای یکتا است. بدون هیچ‌یک از -c یا -n، رکوردهای یکتا تولید می‌کند. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "unspace" .if n \{\ .RS 0 .\} .nf کاربرد: mlr unspace [گزینه‌ها] فاصله‌ها را در کلیدها و/یا مقادیر رکورد با _ جایگزین می‌کند. این قابلیت برای خروجی PPRINT مفید است. گزینه‌ها: -f {x} جایگزینی فاصله‌ها با نویسه پرکننده مشخص‌شده. پیش‌فرض "_". -k حذف فاصله فقط از کلیدها، نه کلیدها و مقادیر. -v حذف فاصله فقط از مقادیر، نه کلیدها و مقادیر. -h|--help نمایش این پیام. .fi .if n \{\ .RE .SS "unsparsify" .if n \{\ .RS 0 .\} .nf کاربرد: mlr unsparsify [گزینه‌ها] رکوردها را با اجتماع نام‌های فیلد در سراسر تمام رکوردهای ورودی چاپ می‌کند. برای نام فیلدهایی که در یک رکورد مشخص غایب هستند اما در رکوردهای دیگر وجود دارند، مقداری را پر می‌کند. این دستور پیش از تولید هرگونه خروجی، تمام ورودی را نگه می‌دارد. گزینه‌ها: --fill-with {filler string} فیلدهای غایب با چه چیزی پر شوند. پیش‌فرض رشته خالی است. -f {a,b,c} مشخص کردن نام فیلدهایی که باید پردازش شوند؛ سایر فیلدها تغییر نمی‌یابند و عملیات جاری (streaming) است. -h|--help نمایش این پیام. مثال: اگر ورودی دو رکورد باشد، یکی 'a=1,b=2' و دیگری 'b=3,c=4' باشد، آنگاه خروجی دو رکورد 'a=1,b=2,c=' و \(cqa=,b=3,c=4' خواهد بود. .fi .if n \{\ .RE .SH "توابع FILTER/PUT (FUNCTIONS FOR FILTER/PUT)" .sp .SS "abs" .if n \{\ .RS 0 .\} .nf (class=math #args=1) قدر مطلق. .fi .if n \{\ .RE .SS "acos" .if n \{\ .RS 0 .\} .nf (class=math #args=1) کسینوس معکوس مثلثاتی. .fi .if n \{\ .RE .SS "acosh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) کسینوس معکوس هذلولوی. .fi .if n \{\ .RE .SS "antimode" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) کم‌تکرارترین مقدار را در یک آرایه یا نگاشت برمی‌گرداند. برای انواع غیر آرایه/غیر نگاشت خطا برمی‌گرداند. مقادیر برای مقایسه به رشته تبدیل می‌شوند، بنابراین برای مثال رشته "1" و عدد صحیح 1 متمایز نیستند. در موارد تساوی، اولین مورد یافت‌شده انتخاب می‌شود. مثال‌ها: antimode([3,3,4,4,4]) برابر با 3 است antimode([3,3,4,4]) برابر با 3 است .fi .if n \{\ .RE.SS "any" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=2) با دریافت یک نگاشت (map) یا آرایه (array) به عنوان آرگومان نخست و یک تابع به عنوان آرگومان دوم، اگر تابع آرگومان برای هر یک از عناصر آرایه/نگاشت مقدار true برگرداند، مقدار بولی true و در غیر این صورت false می‌دهد. برای آرایه‌ها، تابع باید یک آرگومان برای عنصر آرایه بپذیرد؛ برای نگاشت‌ها، باید دو آرگومان برای کلید و مقدار عنصر نگاشت دریافت کند. در هر دو حالت باید یک مقدار بولی برگرداند. مثال‌ها: مثال آرایه: any([10,20,30], func(e) {return $index == e}) مثال نگاشت: any({"a": "foo", "b": "bar"}, func(k,v) {return $[k] == v}) .fi .if n \{\ .RE .SS "append" .if n \{\ .RS 0 .\} .nf (class=collections #args=2) آرگومان دوم را به انتهای آرگومان نخست، که باید یک آرایه باشد، اضافه می‌کند. .fi .if n \{\ .RE .SS "apply" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=2) با دریافت یک نگاشت یا آرایه به عنوان آرگومان نخست و یک تابع به عنوان آرگومان دوم، تابع را روی هر عنصر از آرایه/نگاشت اعمال می‌کند. برای آرایه‌ها، تابع باید یک آرگومان برای عنصر آرایه بپذیرد؛ و باید عنصری جدید برگرداند. برای نگاشت‌ها، باید دو آرگومان برای کلید و مقدار عنصر نگاشت بپذیرد؛ و باید یک جفت کلید-مقدار جدید (یعنی یک نگاشت تک‌ورودی) بازگرداند. مثال‌ها: مثال آرایه: apply([1,2,3,4,5], func(e) {return e ** 3}) مقدار [1, 8, 27, 64, 125] را برمی‌گرداند. مثال نگاشت: apply({"a":1, "b":3, "c":5}, func(k,v) {return {toupper(k): v ** 2}}) مقدار {"A": 1, "B":9, "C": 25}" را برمی‌گرداند. .fi .if n \{\ .RE .SS "arrayify" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) در یک نگاشت/آرایه تو‌در‌تو پیمایش کرده و هر نگاشتی با کلیدهای متوالی "1"، "2" و... را به یک آرایه تبدیل می‌کند. برای دربرگرفتن خروجی unflatten کاربردی است. .fi .if n \{\ .RE .SS "asin" .if n \{\ .RS 0 .\} .nf (class=math #args=1) وارون سینوس مثلثاتی. .fi .if n \{\ .RE .SS "asinh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) وارون سینوس هایپربولیک. .fi .if n \{\ .RE .SS "asserting_absent" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_absent روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_array" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_array روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_bool" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_bool روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_boolean" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_boolean روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_bytes" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_bytes روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_empty" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_empty روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_empty_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) در صورتی که اجرای is_empty_map روی آرگومان مقدار false بازگرداند، با خطا متوقف می‌شود، در غیر این صورت آرگومانش را بازمی‌گرداند. .fi .if n \{\ .RE.SS "asserting_error" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_error روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_float" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_float روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_int" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_int روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_map روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_nonempty_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_nonempty_map روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_not_array" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_not_array روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_not_empty" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_not_empty روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_not_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_not_map روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_not_null" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_not_null روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_null" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_null روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_numeric" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_numeric روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_present" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_present روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "asserting_string" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر is_string روی آرگومان مقدار false برگرداند با خطا متوقف می‌شود، در غیر این صورت آرگومان خود را بازمی‌گرداند. .fi .if n \{\ .RE .SS "atan" .if n \{\ .RS 0 .\} .nf (class=math #args=1) آرک‌تانژانت با یک آرگومان. .fi .if n \{\ .RE.SS "atan2" .if n \{\ .RS 0 .\} .nf (class=math #args=2) آرک‌تانژانت با دو آرگومان. .fi .if n \{\ .RE .SS "atanh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تانژانت هایپربولیک معکوس. .fi .if n \{\ .RE .SS "base64_decode" .if n \{\ .RS 0 .\} .nf (class=string #args=1) یک رشتهٔ کدگذاری‌شده با base64 را به یک مقدار بایت (bytes) رمزگشایی می‌کند؛ برای تفسیر نتیجه به عنوان متن UTF-8 از string() استفاده کنید. اگر ورودی یک base64 معتبر نباشد، خطا برمی‌گرداند. مثال‌ها: base64_decode("aGVsbG8=") بایت‌های 68656c6c6f را می‌دهد string(base64_decode("aGVsbG8=")) مقدار "hello" را می‌دهد .fi .if n \{\ .RE .SS "base64_encode" .if n \{\ .RS 0 .\} .nf (class=string #args=1) یک رشته یا مقدار بایت (bytes) را با استفاده از کدگذاری استاندارد base64 کدگذاری می‌کند. مثال‌ها: base64_encode("hello") مقدار "aGVsbG8=" را می‌دهد base64_encode(b"\exff") مقدار "/w==" را می‌دهد .fi .if n \{\ .RE .SS "bitcount" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=1) شمارش بیت‌های ۱. .fi .if n \{\ .RE .SS "boolean" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1) تبدیل int/float/bool/string به بولی (boolean). .fi .if n \{\ .RE .SS "bytes" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1) تبدیل رشته به بایت‌ها (bytes)؛ مقادیر بایت بدون تغییر عبور می‌کنند. برای حالت معکوس string() را ببینید. مثال‌ها: bytes("hi") بایت‌های 6869 را می‌دهد string(bytes("hi")) مقدار "hi" را می‌دهد .fi .if n \{\ .RE .SS "capitalize" .if n \{\ .RS 0 .\} .nf (class=string #args=1) تبدیل نویسهٔ اول رشته به حروف بزرگ. .fi .if n \{\ .RE .SS "cbrt" .if n \{\ .RS 0 .\} .nf (class=math #args=1) ریشهٔ سوم (ریشه مکعبی). .fi .if n \{\ .RE .SS "ceil" .if n \{\ .RS 0 .\} .nf (class=math #args=1) سقف (Ceiling): نزدیک‌ترین عدد صحیح برابر یا بزرگ‌تر. .fi .if n \{\ .RE .SS "clean_whitespace" .if n \{\ .RS 0 .\} .nf (class=string #args=1) مشابه collapse_whitespace و strip، همراه با استنتاج نوع (type inference). .fi .if n \{\ .RE .SS "collapse_whitespace" .if n \{\ .RS 0 .\} .nf (class=string #args=1) حذف فاصله‌های سفید (whitespace) تکراری از رشته. .fi .if n \{\ .RE .SS "concat" .if n \{\ .RS 0 .\} .nf (class=collections #args=variadic) الحاق آرایه‌ای از آرگومان‌ها را برمی‌گرداند. با آرگومان‌های غیرآرایه‌ای مانند آرایه‌های تک‌عضوی رفتار می‌شود. مثال‌ها: concat(1,2,3) برابر با [1,2,3] است concat([1,2],3) برابر با [1,2,3] است concat([1,2],[3]) برابر با [1,2,3] است .fi .if n \{\ .RE.SS "contains" .if n \{\ .RS 0 .\} .nf (class=string #args=2) اگر آرگومان نخست حاوی آرگومان دوم به عنوان زیررشته باشد، true را برمی‌گرداند. این مانند نوشتن `index(arg1, arg2) >= 0` اما با تایپ کمتر است. ورودی‌های اسکالر غیررشته‌ای را به رشته تبدیل می‌کند؛ اگر هر یک از آرگومان‌ها آرایه یا مپ (map) باشند یک خطا صادر می‌کند. برای بررسی عضویت در آرایه، از `any` استفاده کنید، مانند `any([1,2,3], func(e) {return e == $foo})`. مثال‌ها: contains("abcde", "e") خروجی true می‌دهد contains("abcde", "x") خروجی false می‌دهد contains(12345, 34) خروجی true می‌دهد contains("forêt", "ê") خروجی true می‌دهد contains([1,2,3], 2) خروجی (error) می‌دهد .fi .if n \{\ .RE .SS "cos" .if n \{\ .RS 0 .\} .nf (class=math #args=1) کسینوس مثلثاتی. .fi .if n \{\ .RE .SS "cosh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) کسینوس هذلولوی. .fi .if n \{\ .RE .SS "count" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) طول یک آرایه یا مپ را برمی‌گرداند. برای انواع غیر آرایه/غیر مپ خطا برمی‌گرداند. مثال‌ها: count([7,8,9]) برابر است با 3 count({"a":7,"b":8,"c":9}) برابر است با 3 .fi .if n \{\ .RE .SS "depth" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) بیشینه عمق مپ/آرایه را چاپ می‌کند. مقادیر اسکالر عمق 0 دارند. .fi .if n \{\ .RE .SS "dhms2fsec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌ها را به صورت ممیز شناور بازیابی می‌کند؛ مانند dhms2fsec("5d18h53m20.250000s") = 500000.250000 .fi .if n \{\ .RE .SS "dhms2sec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌ها را به صورت عدد صحیح بازیابی می‌کند؛ مانند dhms2sec("5d18h53m20s") = 500000 .fi .if n \{\ .RE .SS "distinct_count" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) تعداد مقادیر متمایز در یک آرایه یا مپ را برمی‌گرداند. برای انواع غیر آرایه/غیر مپ خطا صادر می‌کند. مقادیر برای مقایسه به رشته تبدیل می‌شوند، بنابراین برای نمونه رشته "1" و عدد صحیح 1 متمایز در نظر گرفته نمی‌شوند. مثال‌ها: distinct_count([7,8,9,7]) برابر است با 3 distinct_count([1,"1"]) برابر است با 1 distinct_count([1,1.0]) برابر است با 2 .fi .if n \{\ .RE .SS "erf" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تابع خطا. .fi .if n \{\ .RE .SS "erfc" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تابع خطای متمم. .fi .if n \{\ .RE .SS "every" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=2) با دریافت یک مپ یا آرایه به عنوان آرگومان نخست و یک تابع به عنوان آرگومان دوم، در صورتی که تابع مذکور برای تک‌تک عناصر آرایه/مپ مقدار true را بازگرداند، مقدار بولی true و در غیر این صورت false می‌دهد. برای آرایه‌ها، این تابع باید یک آرگومان (عنصر آرایه) بپذیرد؛ برای مپ‌ها، باید دو آرگومان (کلید و مقدار عنصر مپ) بپذیرد. در هر دو حالت باید یک مقدار بولی برگرداند. مثال‌ها: مثال آرایه: every(["a", "b", "c"], func(e) {return $[e] >= 0}) مثال مپ: every({"a": "foo", "b": "bar"}, func(k,v) {return $[k] == v}) .fi .if n \{\ .RE .SS "exec" .if n \{\ .RS 0 .\} .nf (class=system #args=variadic) '$output = exec( "command", ["arg1", "arg2"], {"env": ["ENV_VAR=ENV_VALUE", "ENV_VAR2=ENV_VALUE2"], "dir": "/tmp/run_command_here", "stdin_string": "this is input fed to program", "combined_output": true )' دستوری را از طریق فایل اجرایی، مسیر، آرگومان‌ها و محیط اجرا می‌کند و خروجی استاندارد (stdout) آن را منهای کاراکتر carriage return پایانی برمی‌گرداند. مثال: exec("echo", ["I don't do", "$SHELL things"], {"env": "SHELL=sh"}) خروجی "I don't do $SHELL things" را تولید می‌کند .fi .if n \{\ .RE.SS "exp" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تابع نمایی e**x. .fi .if n \{\ .RE .SS "expm1" .if n \{\ .RS 0 .\} .nf (class=math #args=1) e**x - 1. .fi .if n \{\ .RE .SS "flatten" .if n \{\ .RS 0 .\} .nf (class=collections #args=2,3) نقشه‌های چندسطحی را به نقشه‌های تک‌سطحی مسطح می‌کند. برای ساختارهای تودرتوی شبه‌JSON در قالب پرونده‌های غیر JSON مانند CSV مفید است. با دو آرگومان، آرگومان نخست یک نقشه (احتمالاً $*) و آرگومان دوم جداکننده مسطح‌سازی است. با سه آرگومان، آرگومان نخست پیشوند، دومی جداکننده مسطح‌سازی، و سومی یک نقشه است؛ flatten($*, ".") همانند flatten("", ".", $*) عمل می‌کند. برای اطلاعات بیشتر، بخش «Flatten/unflatten: converting between JSON and tabular formats» را در https://miller.readthedocs.io ببینید. مثال‌ها: flatten({"a":[1,2],"b":3}, ".") برابر است با {"a.1": 1, "a.2": 2, "b": 3}. flatten("a", ".", {"b": { "c": 4 }}) برابر است با {"a.b.c" : 4}. flatten("", ".", {"a": { "b": 3 }}) برابر است با {"a.b" : 3}. .fi .if n \{\ .RE .SS "float" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1) تبدیل int/float/bool/string به float. .fi .if n \{\ .RE .SS "floor" .if n \{\ .RS 0 .\} .nf (class=math #args=1) کف: نزدیک‌ترین عدد صحیح مساوی یا کوچکتر. .fi .if n \{\ .RE .SS "fmtifnum" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) همسان با fmtnum، به جز اینکه اگر خروجی با خطا مواجه شود، آرگومان اول را همان‌طور که هست برمی‌گرداند. مثال‌ها: fmtifnum(3.4, "%.6f") خروجی می‌دهد 3.400000" fmtifnum("abc", "%.6f") خروجی می‌دهد abc" $* = fmtifnum($*, "%.6f") فیلدهای عددی رکورد فعلی را قالب‌بندی کرده و فیلدهای غیرعددی را دست‌نخورده باقی می‌گذارد .fi .if n \{\ .RE .SS "fmtnum" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) تبدیل int/float/bool به رشته با استفاده از رشته قالب‌بندی سبک printf (https://pkg.go.dev/fmt)، مانند '$s = fmtnum($n, "%08d")' یا '$t = fmtnum($n, "%.6e")'. افزونه اختصاصی Miller: "%_d" و "%_f" برای جدا کردن هزارگان با کاما. این تابع به صورت بازگشتی روی مقادیر آرایه‌ها و نقشه‌ها اعمال می‌شود. مثال‌ها: $y = fmtnum($x, "%.6f") $o = fmtnum($n, "%d") $o = fmtnum($n, "%12d") $y = fmtnum($x, "%.6_f") $o = fmtnum($n, "%_d") $o = fmtnum($n, "%12_d") .fi .if n \{\ .RE .SS "fold" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=3) با دریافت یک نقشه یا آرایه به عنوان آرگومان نخست و یک تابع به عنوان آرگومان دوم، مدخل‌ها را در یک خروجی نهایی انباشته می‌کند -- برای نمونه، مجموع یا حاصل‌ضرب. برای آرایه‌ها، تابع باید دو آرگومان بپذیرد: برای مقدار انباشته‌شده و عنصر آرایه. برای نقشه‌ها، باید چهار آرگومان بپذیرد: برای کلید و مقدار انباشته‌شده، و کلید و مقدار عنصر نقشه؛ و باید انباشت‌گر به‌روزشده را به صورت یک جفت کلید-مقدار جدید (یعنی یک نقشه با یک مدخل) برگرداند. مقدار اولیه انباشت‌گر از آرگومان سوم گرفته می‌شود. مثال‌ها: مثال آرایه: fold([1,2,3,4,5], func(acc,e) {return acc + e**3}, 10000) مقدار 10225 را برمی‌گرداند. مثال نقشه: fold({"a":1, "b":3, "c": 5}, func(acck,accv,ek,ev) {return {"sum": accv+ev**2}}, {"sum":10000}) مقدار 10035 را برمی‌گرداند. .fi .if n \{\ .RE .SS "format" .if n \{\ .RS 0 .\} .nf (class=string #args=variadic) با استفاده از آرگومان نخست به عنوان رشته قالب، آرگومان‌های باقیمانده را به جای هر «{}» در رشته قالب جای‌گذاری می‌کند. همچنین از جانگهدارنده‌های موقعیتی بر پایه ۱ مانند «{1}» پشتیبانی می‌کند که امکان استفاده مجدد و/یا مرتب‌سازی دوباره آرگومان‌ها را فراهم می‌سازند. جانگهدارنده‌های ساده «{}» آرگومان‌ها را به صورت متوالی و مستقل از هرگونه جانگهدارنده موقعیتی مصرف می‌کنند. در صورت کم بودن آرگومان‌ها و همچنین برای جانگهدارنده‌های موقعیتی که از تعداد آرگومان‌ها فراتر روند، رشته خالی در نظر گرفته می‌شود؛ آرگومان‌های اضافی نادیده گرفته می‌شوند. «{0}» یک مقدار خطا است، زیرا جانگهدارنده‌های موقعیتی بر پایه ۱ هستند. مثال‌ها: format("{}:{}:{}", 1,2) خروجی می‌دهد "1:2:". format("{}:{}:{}", 1,2,3) خروجی می‌دهد "1:2:3". format("{}:{}:{}", 1,2,3,4) خروجی می‌دهد "1:2:3". format("{1}:{2}:{1}", "a","b") خروجی می‌دهد "a:b:a". format("{2}{}:{1}{}", 3,4) خروجی می‌دهد "43:34". .fi .if n \{\ .RE .SS "fsec2dhms" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌های ممیز شناور را قالب‌بندی می‌کند؛ مانند fsec2dhms(500000.25) = "5d18h53m20.250000s" .fi .if n \{\ .RE .SS "fsec2hms" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌های ممیز شناور را قالب‌بندی می‌کند؛ مانند fsec2hms(5000.25) = "01:23:20.250000" .fi .if n \{\ .RE.SS "get_keys" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) آرایه‌ای از کلیدهای map یا آرایه را برمی‌گرداند .fi .if n \{\ .RE .SS "get_values" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) آرایه‌ای از مقادیر map یا آرایه را برمی‌گرداند -- در حالت دوم، رونوشتی از آرایه را برمی‌گرداند .fi .if n \{\ .RE .SS "gmt2localtime" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) تبدیل از یک رشته زمان GMT به یک رشته زمان محلی. $TZ بررسی می‌شود مگر اینکه آرگومان دوم ارائه شده باشد. مثال‌ها: gmt2localtime("1999-12-31T22:00:00Z") = "2000-01-01 00:00:00" با TZ="Asia/Istanbul" gmt2localtime("1999-12-31T22:00:00Z", "Asia/Istanbul") = "2000-01-01 00:00:00" .fi .if n \{\ .RE .SS "gmt2nsec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) برچسب زمانی GMT را به صورت عدد صحیح نانوثانیه از مبدأ زمان (epoch) تجزیه می‌کند. مثال: gmt2nsec("2001-02-03T04:05:06Z") = 981173106000000000 .fi .if n \{\ .RE .SS "gmt2sec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) برچسب زمانی GMT را به صورت عدد صحیح ثانیه از مبدأ زمان (epoch) تجزیه می‌کند. مثال: gmt2sec("2001-02-03T04:05:06Z") = 981173106 .fi .if n \{\ .RE .SS "gssub" .if n \{\ .RS 0 .\} .nf (class=string #args=3) مانند gsub اما بدون استفاده از عبارت‌های باقاعده (regex). هیچ نویسه‌ای خاص نیست. مثال: gssub("ab.d.fg", ".", "X") مقدار "abXdXfg" را می‌دهد .fi .if n \{\ .RE .SS "gsub" .if n \{\ .RS 0 .\} .nf (class=string #args=3) '$name = gsub($name, "old", "new")': جایگزینی همه، با پشتیبانی از عبارت‌های باقاعده. گروه‌های تطبیق \e1 تا \e9 در بخش new با (...) در بخش old منطبق می‌شوند و باید درون همان فراخوانی gsub استفاده شوند -- برای دستورات بعدی DSL باقی نمی‌مانند. همچنین =~ و regextract را ببینید. همچنین «Regular expressions» را در https://miller.readthedocs.io ببینید. مثال‌ها: gsub("ababab", "ab", "XY") مقدار "XYXYXY" را می‌دهد gsub("abc.def", ".", "X") مقدار "XXXXXXX" را می‌دهد gsub("abc.def", "\e.", "X") مقدار "abcXdef" را می‌دهد gsub("abcdefg", "[ce]", "X") مقدار "abXdXfg" را می‌دهد gsub("prefix4529:suffix8567", "(....ix)([0-9]+)", "[\e1 : \e2]") مقدار "[prefix : 4529]:[suffix : 8567]" را می‌دهد .fi .if n \{\ .RE .SS "haskey" .if n \{\ .RS 0 .\} .nf (class=collections #args=2) درست/نادرست (True/false) بر اساس اینکه map کلید را داشته باشد/نداشته باشد، مانند 'haskey($*, "a")' یا 'haskey(mymap, mykey)'، یا درست/نادرست بر اساس اینکه اندیس آرایه در محدوده / خارج از محدوده باشد. اگر آرگومان نخست یک map یا آرایه نباشد خطا می‌دهد. توجه: در آرایه‌های Miller بازهٔ -n..-1 نام مستعاری برای 1..n است. .fi .if n \{\ .RE .SS "hasvalue" .if n \{\ .RS 0 .\} .nf (class=collections #args=2) درست/نادرست (True/false) بر اساس اینکه map/آرایه مقدار را داشته باشد/نداشته باشد، مانند 'hasvalue($*, "a")' یا 'hasvalue(myarray, myvalue)'؛ اگر مقدار در مجموعه موجود باشد true برمی‌گرداند. اگر آرگومان نخست یک map یا آرایه نباشد خطا می‌دهد. .fi .if n \{\ .RE .SS "hex_decode" .if n \{\ .RS 0 .\} .nf (class=string #args=1) رشته کدگذاری‌شده به صورت hex را به یک مقدار بایت (bytes) رمزگشایی می‌کند؛ برای تفسیر نتیجه به صورت متن UTF-8 از string() استفاده کنید. اگر ورودی hex معتبری نباشد خطا برمی‌گرداند. مثال‌ها: hex_decode("6869") بایت‌های 6869 را می‌دهد string(hex_decode("6869")) مقدار "hi" را می‌دهد .fi .if n \{\ .RE .SS "hex_encode" .if n \{\ .RS 0 .\} .nf (class=string #args=1) یک رشته یا مقدار بایت (bytes) را به صورت hex با حروف کوچک کدگذاری می‌کند. مثال: hex_encode("hi") مقدار "6869" را می‌دهد .fi .if n \{\ .RE .SS "hexfmt" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1) تبدیل int به رشته hex، مثلاً 255 به "0xff". .fi .if n \{\ .RE.SS "hms2fsec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌ها را به‌صورت ممیز شناور بازیابی می‌کند، مانند hms2fsec("01:23:20.250000") = 5000.250000 .fi .if n \{\ .RE .SS "hms2sec" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌ها را به‌صورت عدد صحیح بازیابی می‌کند، مانند hms2sec("01:23:20") = 5000 .fi .if n \{\ .RE .SS "hostname" .if n \{\ .RS 0 .\} .nf (class=system #args=0) نام میزبان (hostname) را به‌صورت یک رشته برمی‌گرداند. .fi .if n \{\ .RE .SS "index" .if n \{\ .RS 0 .\} .nf (class=string #args=2) اندیس (بر پایهٔ ۱) آرگومان دوم را درون آرگومان اول برمی‌گرداند. اگر آرگومان دوم زیررشته‌ای از آرگومان اول نباشد، \-1 برمی‌گرداند. ورودی‌های نرده‌ای غیررشته‌ای را به رشته تبدیل می‌کند؛ اگر هر یک از آرگومان‌ها آرایه یا نگاشت باشند، یک خطا ایجاد می‌کند. برای شمارش نویسه‌ها از کدگذاری UTF-8 استفاده می‌کند، نه بایت‌ها. مثال‌ها: index("abcde", "e") مقدار 5 را می‌دهد index("abcde", "x") مقدار \-1 را می‌دهد index(12345, 34) مقدار 3 را می‌دهد index("forêt", "t") مقدار 5 را می‌دهد index([1,2,3], 2) خطا می‌دهد (error) .fi .if n \{\ .RE .SS "int" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1,2) تبدیل int/float/bool/string به int. اگر آرگومان دوم حذف شود و آرگومان اول یک رشته باشد، مبنا از پیشوند آرگومان اول استنباط می‌شود. اگر آرگومان دوم مشخص شود و آرگومان اول یک رشته باشد، از آرگومان دوم به‌عنوان مبنا استفاده می‌شود. اگر آرگومان دوم مشخص شود و آرگومان اول رشته نباشد، آرگومان دوم نادیده گرفته می‌شود. مثال‌ها: int("345") مقدار ده‌دهی 345 را می‌دهد (ورودی مبنای 10/ده‌دهی استنباط می‌شود) int("0xff") مقدار ده‌دهی 255 را می‌دهد (ورودی مبنای 16/هگزادسیمال استنباط می‌شود) int("0377") مقدار ده‌دهی 255 را می‌دهد (ورودی مبنای 8/اکتال استنباط می‌شود) int("0b11010011") مقدار ده‌دهی 211 که معادل هگزادسیمال 0xd3 است را می‌دهد (ورودی مبنای 2/دودویی استنباط می‌شود) int("0377", 10) مقدار ده‌دهی 377 را می‌دهد int(345, 16) مقدار ده‌دهی 345 را می‌دهد int(string(345), 16) مقدار ده‌دهی 837 را می‌دهد .fi .if n \{\ .RE .SS "invqnorm" .if n \{\ .RS 0 .\} .nf (class=math #args=1) معکوس تابع توزیع تجمعی نرمال. توجه داشته باشید که invqorm(urand()) دارای توزیع نرمال است. .fi .if n \{\ .RE .SS "is_absent" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد در ورودی موجود باشد false، در غیر این صورت true برمی‌گرداند .fi .if n \{\ .RE .SS "is_array" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر آرگومان یک آرایه باشد true برمی‌گرداند. .fi .if n \{\ .RE .SS "is_bool" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد با یک مقدار بولی (boolean) موجود باشد true برمی‌گرداند. مترادف با is_boolean. .fi .if n \{\ .RE .SS "is_boolean" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد با یک مقدار بولی (boolean) موجود باشد true برمی‌گرداند. مترادف با is_bool. .fi .if n \{\ .RE .SS "is_bytes" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد با مقداری از نوع بایت (bytes) موجود باشد true برمی‌گرداند. .fi .if n \{\ .RE .SS "is_empty" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد در ورودی با مقدار رشتهٔ خالی موجود باشد true، در غیر این صورت false برمی‌گرداند. .fi .if n \{\ .RE.SS "is_empty_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک map خالی باشد. .fi .if n \{\ .RE .SS "is_error" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک خطا باشد، مانند محاسبه طول رشته از یک عدد صحیح (integer). .fi .if n \{\ .RE .SS "is_float" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر فیلد موجود باشد و مقدار آن float استنباط شود. .fi .if n \{\ .RE .SS "is_int" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر فیلد موجود باشد و مقدار آن int استنباط شود. .fi .if n \{\ .RE .SS "is_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک map باشد. .fi .if n \{\ .RE .SS "is_nan" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان مقدار ممیز شناور NaN (غیرعدد) باشد. توجه داشته باشید که NaN این ویژگی را دارد که NaN != NaN است، بنابراین به جای 'x == NaN' باید از 'is_nan(x)' استفاده کنید. .fi .if n \{\ .RE .SS "is_nonempty_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک map غیرخالی باشد. .fi .if n \{\ .RE .SS "is_not_array" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک array نباشد. .fi .if n \{\ .RE .SS "is_not_empty" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر فیلد با مقداری غیرخالی در ورودی موجود باشد، در غیر این صورت false. .fi .if n \{\ .RE .SS "is_not_map" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان یک map نباشد. .fi .if n \{\ .RE .SS "is_not_null" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار False اگر آرگومان null باشد (خالی، ناموجود یا JSON null)، در غیر این صورت true. .fi .if n \{\ .RE .SS "is_null" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر آرگومان null باشد (خالی، ناموجود یا JSON null)، در غیر این صورت false. .fi .if n \{\ .RE .SS "is_numeric" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر فیلد موجود باشد و مقدار آن int یا float استنباط شود. .fi .if n \{\ .RE .SS "is_present" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) مقدار True اگر فیلد در ورودی موجود باشد، در غیر این صورت false. .fi .if n \{\ .RE.SS "is_string" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) اگر فیلد با مقداری از نوع رشته (از جمله رشته‌ی خالی) وجود داشته باشد، درست (True) است. .fi .if n \{\ .RE .SS "joink" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) از کلیدهای نگاشت/آرایه رشته می‌سازد. آرگومان نخست نگاشت/آرایه است؛ آرگومان دوم رشته‌ی جداکننده است. مثال‌ها: joink({"a":3,"b":4,"c":5}, ",") = "a,b,c". joink([1,2,3], ",") = "1,2,3". .fi .if n \{\ .RE .SS "joinkv" .if n \{\ .RS 0 .\} .nf (class=conversion #args=3) از جفت‌های کلید\-مقدار نگاشت/آرایه رشته می‌سازد. آرگومان نخست نگاشت/آرایه است؛ دومی رشته‌ی جداکننده‌ی جفت‌ها؛ سومی رشته‌ی جداکننده‌ی فیلدها است. یادسپار: در خروجی و در آرگومان‌های joinkv علامت "=" پیش از "," قرار می‌گیرد. مثال‌ها: joinkv([3,4,5], "=", ",") = "1=3,2=4,3=5" joinkv({"a":3,"b":4,"c":5}, ":", ";") = "a:3;b:4;c:5" .fi .if n \{\ .RE .SS "joinv" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) از مقادیر نگاشت/آرایه رشته می‌سازد. آرگومان نخست نگاشت/آرایه است؛ آرگومان دوم رشته‌ی جداکننده است. مثال‌ها: joinv([3,4,5], ",") = "3,4,5" joinv({"a":3,"b":4,"c":5}, ",") = "3,4,5" .fi .if n \{\ .RE .SS "json_parse" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) مقدار را از یک رشته با قالب JSON تبدیل می‌کند. .fi .if n \{\ .RE .SS "json_stringify" .if n \{\ .RS 0 .\} .nf (class=collections #args=1,2) مقدار را به یک رشته با قالب JSON تبدیل می‌کند. خروجی پیش‌فرض تک‌خطی است. با تنظیم آرگومان بولی اختیاری دوم روی true، خروجی چندخطی تولید می‌کند. .fi .if n \{\ .RE .SS "kurtosis" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) کشیدگی نمونه (sample kurtosis) مقادیر موجود در یک آرایه یا نگاشت را بازمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشته‌ی خالی (یا همان void) برمی‌گرداند؛ برای انواع غیرآرایه/غیرنگاشت خطا بازمی‌گرداند. مثال: kurtosis([4,5,9,10,11]) is -1.6703688 .fi .if n \{\ .RE .SS "latin1_to_utf8" .if n \{\ .RS 0 .\} .nf (class=string #args=1) تلاش می‌کند رشته‌ی کدگذاری‌شده با Latin-1 را به رشته‌ی کدگذاری‌شده با UTF-8 تبدیل کند. اگر آرگومان آرایه یا نگاشت باشد، به صورت بازگشتی روی آن عمل می‌کند. مثال‌ها: $y = latin1_to_utf8($x) $* = latin1_to_utf8($*) .fi .if n \{\ .RE .SS "leafcount" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) تعداد کل مقادیر انتهایی (پایانی) را در نگاشت/آرایه شمارش می‌کند. برای نگاشت/آرایه‌ی تک‌سطحی مشابه length عمل می‌کند. .fi .if n \{\ .RE .SS "leftpad" .if n \{\ .RS 0 .\} .nf (class=string #args=3) آرگومان نخست را با استفاده از مقدار پرکننده‌ی مشخص‌شده (آرگومان سوم از نوع رشته) از سمت چپ حداکثر تا طول مشخص‌شده (آرگومان دوم از نوع عدد صحیح) پر می‌کند (left-pad). اگر آرگومان نخست رشته نباشد، ابتدا به رشته تبدیل خواهد شد. مثال‌ها: leftpad("abcdefg", 10 , "*") gives "***abcdefg". leftpad("abcdefg", 10 , "XY") gives "XYabcdefg". leftpad("1234567", 10 , "0") gives "0001234567". .fi .if n \{\ .RE .SS "length" .if n \{\ .RS 0 .\} .nf (class=collections #args=1) تعداد ورودی‌های سطح بالا (top-level) را در آرایه/نگاشت شمارش می‌کند. اسکالرها دارای طول ۱ هستند. .fi .if n \{\ .RE .SS "localtime2gmt" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) یک رشته‌ی زمان محلی را به رشته‌ی زمان GMT تبدیل می‌کند. در صورتی که آرگومان دوم ارائه نشده باشد، متغیر $TZ را بررسی می‌کند. مثال‌ها: localtime2gmt("2000-01-01 00:00:00") = "1999-12-31T22:00:00Z" with TZ="Asia/Istanbul" localtime2gmt("2000-01-01 00:00:00", "Asia/Istanbul") = "1999-12-31T22:00:00Z" .fi .if n \{\ .RE.SS "localtime2nsec" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) برچسب زمانی محلی را به‌صورت نانوثانیه‌های صحیح از مبدأ زمانی (epoch) تجزیه می‌کند. متغیر محیطی $TZ را بررسی می‌کند، مگر اینکه آرگومان دوم مشخص شده باشد. مثال‌ها: localtime2nsec("2001-02-03 04:05:06") = 981165906000000000 با TZ="Asia/Istanbul" localtime2nsec("2001-02-03 04:05:06", "Asia/Istanbul") = 981165906000000000" .fi .if n \{\ .RE .SS "localtime2sec" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) برچسب زمانی محلی را به‌صورت ثانیه‌های صحیح از مبدأ زمانی (epoch) تجزیه می‌کند. متغیر محیطی $TZ را بررسی می‌کند، مگر اینکه آرگومان دوم مشخص شده باشد. مثال‌ها: localtime2sec("2001-02-03 04:05:06") = 981165906 با TZ="Asia/Istanbul" localtime2sec("2001-02-03 04:05:06", "Asia/Istanbul") = 981165906" .fi .if n \{\ .RE .SS "log" .if n \{\ .RS 0 .\} .nf (class=math #args=1) لگاریتم طبیعی (بر پایه e). .fi .if n \{\ .RE .SS "log10" .if n \{\ .RS 0 .\} .nf (class=math #args=1) لگاریتم بر پایهٔ ۱۰. .fi .if n \{\ .RE .SS "log1p" .if n \{\ .RS 0 .\} .nf (class=math #args=1) log(1-x). .fi .if n \{\ .RE .SS "logifit" .if n \{\ .RS 0 .\} .nf (class=math #args=3) با داشتن m و b از رگرسیون لجستیک، برازش را محاسبه می‌کند: $yhat=logifit($x,$m,$b). .fi .if n \{\ .RE .SS "lstrip" .if n \{\ .RS 0 .\} .nf (class=string #args=1) فاصله‌های خالی ابتدای رشته را حذف می‌کند. .fi .if n \{\ .RE .SS "madd" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=3) a + b mod m (اعداد صحیح) .fi .if n \{\ .RE .SS "mapdiff" .if n \{\ .RS 0 .\} .nf (class=collections #args=variadic) با ۰ آرگومان، نگاشت خالی برمی‌گرداند. با ۱ آرگومان، رونوشتی از آرگومان برمی‌گرداند. با ۲ آرگومان یا بیشتر، رونوشتی از آرگومان ۱ برمی‌گرداند که تمام کلیدهای موجود در هر یک از نگاشت‌های آرگومان‌های باقیمانده از آن حذف شده است. .fi .if n \{\ .RE .SS "mapexcept" .if n \{\ .RS 0 .\} .nf (class=collections #args=variadic) نگاشتی برمی‌گرداند که کلیدهای آرگومان‌های باقیمانده (در صورت وجود) از آن حذف شده‌اند. آرگومان‌های باقیمانده می‌توانند رشته یا آرایه‌ای از رشته باشند. برای مثال، 'mapexcept({1:2,3:4,5:6}, 1, 5, 7)' برابر با '{3:4}' و 'mapexcept({1:2,3:4,5:6}, [1, 5, 7])' برابر با '{3:4}' است. .fi .if n \{\ .RE .SS "mapselect" .if n \{\ .RS 0 .\} .nf (class=collections #args=variadic) نگاشتی برمی‌گرداند که تنها کلیدهای آرگومان‌های باقیمانده در آن تنظیم شده‌اند. آرگومان‌های باقیمانده می‌توانند رشته یا آرایه‌ای از رشته باشند. برای مثال، 'mapselect({1:2,3:4,5:6}, 1, 5, 7)' برابر با '{1:2,5:6}' و 'mapselect({1:2,3:4,5:6}, [1, 5, 7])' برابر با '{1:2,5:6}' است. .fi .if n \{\ .RE .SS "mapsum" .if n \{\ .RS 0 .\} .nf (class=collections #args=variadic) با ۰ آرگومان، نگاشت خالی برمی‌گرداند. با ۱ =< آرگومان، نگاشتی با جفت‌های کلید-مقدار از تمام آرگومان‌ها برمی‌گرداند. در تداخل‌ها، راست‌ترین اولویت دارد؛ برای مثال 'mapsum({1:2,3:4},{1:5})' برابر با '{1:5,3:4}' است. .fi .if n \{\ .RE .SS "max" .if n \{\ .RS 0 .\} .nf (class=math #args=variadic) بیشینهٔ n عدد؛ null بازنده است. توابع min و max همچنین به‌صورت بازگشتی در آرایه‌ها و نگاشت‌ها پیمایش می‌کنند، بنابراین می‌توان از آن‌ها برای دریافت آماره‌های min/max روی مقادیر آرایه/نگاشت استفاده کرد. .fi .if n \{\ .RE.SS "maxlen" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) بیشینه طول رشته مقادیر موجود در یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشتهٔ خالی یا همان void برمی‌گرداند؛ برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. مثال: maxlen(["año", "alto"]) برابر است با 4 .fi .if n \{\ .RE .SS "md5" .if n \{\ .RS 0 .\} .nf (class=hashing #args=1) هش MD5 یک رشته یا مقدار بایتی. .fi .if n \{\ .RE .SS "mean" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) میانگین حسابی مقادیر موجود در یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت خالی، رشتهٔ خالی یا همان void برمی‌گرداند؛ برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. مثال: mean([4,5,7,10]) برابر است با 6.5 .fi .if n \{\ .RE .SS "meaneb" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) میلهٔ خطا (error bar) میانگین حسابی مقادیر موجود در یک آرایه یا نگاشت را، با فرض مستقل و دارای توزیع یکسان بودن مقادیر، برمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشتهٔ خالی یا همان void برمی‌گرداند؛ برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. مثال: meaneb([4,5,7,10]) برابر است با 1.3228756 .fi .if n \{\ .RE .SS "median" .if n \{\ .RS 0 .\} .nf (class=stats #args=1,2) میانه مقادیر یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت خالی، رشتهٔ خالی یا همان void برمی‌گرداند؛ برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. لطفاً برای اطلاعات درباره پرچم‌های اختیاری و کارایی در ورودی‌های بزرگ، تابع percentiles را ببینید. مثال‌ها: median([3,4,5,6,9,10]) برابر است با 6 median([3,4,5,6,9,10],{"interpolate_linearly":true}) برابر است با 5.5 median(["abc", "def", "ghi", "ghi"]) برابر است با "ghi" .fi .if n \{\ .RE .SS "mexp" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=3) a ** b mod m (اعداد صحیح) .fi .if n \{\ .RE .SS "min" .if n \{\ .RS 0 .\} .nf (class=math #args=variadic) کمینهٔ n عدد؛ null در مقایسه بازنده است (نادیده گرفته می‌شود). توابع min و max همچنین به‌صورت بازگشتی درون آرایه‌ها و نگاشت‌ها پیمایش می‌کنند، بنابراین می‌توان از آن‌ها برای دریافت آماره‌های min/max روی مقادیر آرایه/نگاشت استفاده کرد. .fi .if n \{\ .RE .SS "minlen" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) کمینه طول رشته مقادیر موجود در یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشتهٔ خالی یا همان void برمی‌گرداند؛ برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. مثال: minlen(["año", "alto"]) برابر است با 3 .fi .if n \{\ .RE .SS "mmul" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=3) a * b mod m (اعداد صحیح) .fi .if n \{\ .RE .SS "mode" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) مقداری که بیشترین تکرار (بسامد) را در یک آرایه یا نگاشت دارد برمی‌گرداند. برای انواع غیر آرایه‌ای/غیر نگاشتی خطا برمی‌گرداند. مقادیر برای مقایسه به رشته تبدیل می‌شوند، بنابراین برای نمونه رشتهٔ "1" و عدد صحیح 1 متمایز نخواهند بود. در صورت تساوی، نخستین مقدار یافت‌شده انتخاب می‌شود. مثال‌ها: mode([3,3,4,4,4]) برابر است با 4 mode([3,3,4,4]) برابر است با 3 .fi .if n \{\ .RE .SS "msub" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=3) a - b mod m (اعداد صحیح) .fi .if n \{\ .RE .SS "next" .if n \{\ .RS 0 .\} .nf (class=system #args=0) فقط در حالت اسکریپت mlr: رکورد بعدی را از ورودی می‌خواند. اگر رکوردی خوانده شود مقدار true برمی‌گرداند (و $* را برابر با آن قرار می‌دهد)، در انتهای جریان داده مقدار false برمی‌گرداند (و $* برابر با false می‌شود). .fi .if n \{\ .RE.SS "nsec2gmt" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) نانوثانیه‌های صحیح از مبدأ زمانی (epoch) را در قالب برچسب زمانی GMT قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. با داشتن آرگومان صحیح دوم n، شامل n رقم اعشار برای بخش ثانیه‌ها می‌شود. مثال‌ها: nsec2gmt(1234567890000000000) = "2009-02-13T23:31:30Z" nsec2gmt(1234567890123456789) = "2009-02-13T23:31:30Z" nsec2gmt(1234567890123456789, 6) = "2009-02-13T23:31:30.123456Z" .fi .if n \{\ .RE .SS "nsec2gmtdate" .if n \{\ .RS 0 .\} .nf (class=time #args=1) نانوثانیه‌های صحیح از مبدأ زمانی (epoch) را در قالب برچسب زمانی GMT با سال-ماه-روز قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. مثال: sec2gmtdate(1440768801700000000) = "2015-08-28". .fi .if n \{\ .RE .SS "nsec2localdate" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) نانوثانیه‌های صحیح از مبدأ زمانی (epoch) را در قالب برچسب زمانی محلی با سال-ماه-روز قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. به متغیر محیطی $TZ رجوع می‌کند مگر اینکه آرگومان دوم ارائه شده باشد. مثال‌ها: nsec2localdate(1440768801700000000) = "2015-08-28" با TZ="Asia/Istanbul" nsec2localdate(1440768801700000000, "Asia/Istanbul") = "2015-08-28" .fi .if n \{\ .RE .SS "nsec2localtime" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2,3) نانوثانیه‌های صحیح از مبدأ زمانی (epoch) را در قالب برچسب زمانی محلی قالب‌بندی می‌کند. به متغیر محیطی $TZ رجوع می‌کند مگر اینکه آرگومان سوم ارائه شده باشد. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. با داشتن آرگومان صحیح دوم n، شامل n رقم اعشار برای بخش ثانیه‌ها می‌شود مثال‌ها: nsec2localtime(1234567890000000000) = "2009-02-14 01:31:30" با TZ="Asia/Istanbul" nsec2localtime(1234567890123456789) = "2009-02-14 01:31:30" با TZ="Asia/Istanbul" nsec2localtime(1234567890123456789, 6) = "2009-02-14 01:31:30.123456" با TZ="Asia/Istanbul" nsec2localtime(1234567890123456789, 6, "Asia/Istanbul") = "2009-02-14 01:31:30.123456" .fi .if n \{\ .RE .SS "null_count" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) تعداد مقادیری در یک آرایه یا نگاشت را برمی‌گرداند که رشته خالی (معروف به void) یا JSON null هستند. برای انواع غیرآرایه/غیرنگاشت خطا برمی‌گرداند. مقادیر برای مقایسه به رشته تبدیل می‌شوند، بنابراین برای مثال رشته "1" و عدد صحیح 1 متمایز نیستند. مثال: null_count(["a", "", "c"]) برابر است با 1 .fi .if n \{\ .RE .SS "os" .if n \{\ .RS 0 .\} .nf (class=system #args=0) نام سیستم‌عامل را به صورت یک رشته برمی‌گرداند. .fi .if n \{\ .RE .SS "percentile" .if n \{\ .RS 0 .\} .nf (class=stats #args=2,3) صدک داده‌شده از مقادیر موجود در یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت خالی، رشته خالی معروف به void را برمی‌گرداند؛ برای انواع غیرآرایه/غیرنگاشت خطا برمی‌گرداند. لطفاً برای اطلاعات درباره پرچم‌های اختیاری و کارایی در ورودی‌های بزرگ، به تابع percentiles مراجعه کنید. مثال‌ها: percentile([3,4,5,6,9,10], 90) برابر است با 10 percentile([3,4,5,6,9,10], 90, {"interpolate_linearly":true}) برابر است با 9.5 percentile(["abc", "def", "ghi", "ghi"], 90) برابر است با "ghi" .fi .if n \{\ .RE .SS "percentiles" .if n \{\ .RS 0 .\} .nf (class=stats #args=2,3) صدک‌های داده‌شده از مقادیر موجود در یک آرایه یا نگاشت را برمی‌گرداند. برای آرایه/نگاشت خالی، رشته خالی معروف به void را برمی‌گرداند؛ برای انواع غیرآرایه/غیرنگاشت خطا برمی‌گرداند. برای اطلاعات درباره سه پرچم اختیاری، مثال‌ها را ببینید. مثال‌ها: پیش‌فرض‌ها عبارتند از عدم درون‌یابی خطی، تولید یک نگاشت با کلید نام صدک، و مرتب‌سازی ورودی پیش از محاسبه صدک‌ها: percentiles([3,4,5,6,9,10], [25,75]) برابر است با { "25": 4, "75": 9 } percentiles(["abc", "def", "ghi", "ghi"], [25,75]) برابر است با { "25": "def", "75": "ghi" } از "output_array_not_map" (یا کوتاه‌نوشت "oa") برای دریافت خروجی‌ها به صورت یک آرایه استفاده کنید: percentiles([3,4,5,6,9,10], [25,75], {"output_array_not_map":true}) برابر است با [4, 9] از "interpolate_linearly" (یا کوتاه‌نوشت "il") برای انجام درون‌یابی خطی استفاده کنید -- توجه کنید که این پرچم روی ورودی‌های رشته‌ای مقادیر خطا تولید می‌کند: percentiles([3,4,5,6,9,10], [25,75], {"interpolate_linearly":true}) برابر است با { "25": 4.25, "75": 8.25 } تابع percentiles همیشه ورودی‌های خود را پیش از محاسبه صدک‌ها مرتب می‌کند. اگر می‌دانید ورودی شما از قبل مرتب شده است -- همچنین تابع sort_collection را ببینید -- در صورتی که "array_is_sorted" (کوتاه‌نوشت: "ais") را ارسال کنید، محاسبات روی ورودی‌های بزرگ سریع‌تر انجام می‌شود: x = [6,5,9,10,4,3] percentiles(x, [25,75], {"ais":true}) خروجی { "25": 5, "75": 4 } را می‌دهد که نادرست است x = sort_collection(x) percentiles(x, [25,75], {"ais":true}) خروجی { "25": 4, "75": 9 } را می‌دهد که درست است همچنین می‌توانید از این ویژگی برای محاسبه صدک‌ها بر روی مرتب‌سازی دلخواه خود بهره ببرید. برای مثال: ورودی مرتب‌نشده: x = splitax("the quick brown fox jumped loquaciously over the lazy dogs", " ") x برابر است با: ["the", "quick", "brown", "fox", "jumped", "loquaciously", "over", "the", "lazy", "dogs"] صدک‌ها بر روی موقعیت‌های اصلی کلمات در آرایه محاسبه می‌شوند -- "dogs" آخرین است و بنابراین به عنوان p99 ظاهر می‌شود: percentiles(x, [50, 99], {"oa":true, "ais":true}) خروجی ["loquaciously", "dogs"] را می‌دهد با مرتب‌سازی انجام‌شده درون percentiles، کلمه "the" از نظر الفبایی آخرین است و بنابراین p99 خواهد بود: percentiles(x, [50, 99], {"oa":true}) خروجی ["loquaciously", "the"] را می‌دهد با مرتب‌سازی پیش‌فرض انجام‌شده بیرون از percentiles، همان نتیجه حاصل می‌شود: x = sort(x) # یا x = sort_collection(x) x برابر است با: ["brown", "dogs", "fox", "jumped", "lazy", "loquaciously", "over", "quick", "the", "the"] percentiles(x, [50, 99], {"oa":true, "ais":true}) خروجی ["loquaciously", "the"] را می‌دهد percentiles(x, [50, 99], {"oa":true}) خروجی ["loquaciously", "the"] را می‌دهد اکنون با مرتب‌سازی بر اساس طول کلمه، "loquaciously" طولانی‌ترین است و از این رو p99 خواهد بود: x = sort(x, func(a,b) { return strlen(a) <=> strlen(b) } ) x برابر است با: ["fox", "the", "the", "dogs", "lazy", "over", "brown", "quick", "jumped", "loquaciously"] percentiles(x, [50, 99], {"oa":true, "ais":true}) ["over", "loquaciously"] .fi .if n \{\ .RE.SS "pow" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) به توان رساندن. مانند **، اما به صورت یک تابع. .fi .if n \{\ .RE .SS "qnorm" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تابع توزیع تجمعی نرمال. .fi .if n \{\ .RE .SS "reduce" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=2) با دریافت یک map یا آرایه به عنوان آرگومان اول و یک تابع به عنوان آرگومان دوم، ورودی‌ها را در یک خروجی نهایی انباشته می‌کند -- برای مثال، مجموع یا حاصل‌ضرب. برای آرایه‌ها، تابع باید دو آرگومان برای مقدار انباشته‌شده و عنصر آرایه دریافت کند و عنصر انباشته‌شده را بازگرداند. برای mapها، باید چهار آرگومان برای کلید و مقدار انباشته‌شده، و کلید و مقدار عنصر map دریافت کند؛ و باید انباشتگر به‌روزرسانی‌شده را به صورت یک جفت کلید-مقدار جدید (یعنی یک map تک‌ورودی) بازگرداند. مقدار اولیه برای انباشتگر، اولین عنصر برای آرایه‌ها، یا جفت کلید-مقدار اولین عنصر برای mapها است. مثال‌ها: مثال آرایه: reduce([1,2,3,4,5], func(acc,e) {return acc + e**3}) مقدار 225 را برمی‌گرداند. مثال map: عبارت reduce({"a":1, "b":3, "c": 5}, func(acck,accv,ek,ev) {return {"sum_of_squares": accv + ev**2}}) مقدار {"sum_of_squares": 35} را برمی‌گرداند. .fi .if n \{\ .RE .SS "regextract" .if n \{\ .RS 0 .\} .nf (class=string #args=2) یک زیررشته منطبق با یک عبارت باقاعده (regular expression) را از ورودی استخراج می‌کند (در صورت وجود چند تطابق، اولین مورد). از گروه‌های گیرش (capture groups) استفاده نمی‌کند؛ همچنین عملگر =~ را ببینید که این کار را انجام می‌دهد. مثال‌ها: regextract("index ab09 file", "[a-z][a-z][0-9][0-9]") خروجی "ab09" را می‌دهد regextract("index a999 file", "[a-z][a-z][0-9][0-9]") خروجی (absent) را می‌دهد، که منجر به انجام نشدن تخصیص خواهد شد. .fi .if n \{\ .RE .SS "regextract_or_else" .if n \{\ .RS 0 .\} .nf (class=string #args=3) مانند regextract عمل می‌کند اما آرگومان سوم، مقدار بازگشتی در صورتی است که رشته ورودی (آرگومان اول) با الگو (آرگومان دوم) تطابق نداشته باشد. مثال‌ها: regextract_or_else("index ab09 file", "[a-z][a-z][0-9][0-9]", "nonesuch") خروجی "ab09" را می‌دهد regextract_or_else("index a999 file", "[a-z][a-z][0-9][0-9]", "nonesuch") خروجی "nonesuch" را می‌دهد .fi .if n \{\ .RE .SS "rightpad" .if n \{\ .RS 0 .\} .nf (class=string #args=3) آرگومان اول را با استفاده از مقدار پرکننده مشخص‌شده (آرگومان سوم، از نوع رشته) حداکثر تا طول مشخص‌شده (آرگومان دوم، از نوع عدد صحیح) از سمت راست پر (pad) می‌کند. اگر آرگومان اول رشته نباشد، ابتدا به رشته تبدیل خواهد شد. مثال‌ها: rightpad("abcdefg", 10 , "*") خروجی "abcdefg***" را می‌دهد. rightpad("abcdefg", 10 , "XY") خروجی "abcdefgXY" را می‌دهد. rightpad("1234567", 10 , "0") خروجی "1234567000" را می‌دهد. .fi .if n \{\ .RE .SS "round" .if n \{\ .RS 0 .\} .nf (class=math #args=1) گرد کردن به نزدیک‌ترین عدد صحیح. .fi .if n \{\ .RE .SS "roundm" .if n \{\ .RS 0 .\} .nf (class=math #args=2) گرد کردن به نزدیک‌ترین مضرب m: عبارت roundm($x,$m) همانند round($x/$m)*$m است. .fi .if n \{\ .RE .SS "rstrip" .if n \{\ .RS 0 .\} .nf (class=string #args=1) حذف نویسه‌های فاصله خالی (whitespace) انتهایی از رشته. .fi .if n \{\ .RE .SS "sec2dhms" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌های عدد صحیح را قالب‌بندی می‌کند، مانند sec2dhms(500000) = "5d18h53m20s" .fi .if n \{\ .RE .SS "sec2gmt" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) ثانیه‌های سپری‌شده از مبدأ زمانی (epoch) را به عنوان برچسب زمانی GMT قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. با آرگومان عدد صحیح دوم n، شامل n رقم اعشار برای بخش ثانیه‌ها خواهد بود. مثال‌ها: sec2gmt(1234567890) = "2009-02-13T23:31:30Z" sec2gmt(1234567890.123456) = "2009-02-13T23:31:30Z" sec2gmt(1234567890.123456, 6) = "2009-02-13T23:31:30.123456Z" .fi .if n \{\ .RE .SS "sec2gmtdate" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌های سپری‌شده از epoch (بخش عدد صحیح) را به عنوان برچسب زمانی GMT با فرمت سال-ماه-روز قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. مثال: sec2gmtdate(1440768801.7) = "2015-08-28". .fi .if n \{\ .RE.SS "sec2hms" .if n \{\ .RS 0 .\} .nf (class=time #args=1) ثانیه‌های عدد صحیح را قالب‌بندی می‌کند؛ مانند sec2hms(5000) = "01:23:20" .fi .if n \{\ .RE .SS "sec2localdate" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2) ثانیه‌های سپری‌شده از مبدأ زمانی epoch (بخش صحیح) را به صورت برچسب زمانی محلی با سال-ماه-روز قالب‌بندی می‌کند. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. به متغیر محیطی $TZ رجوع می‌کند مگر اینکه آرگومان دوم ارائه شده باشد. مثال‌ها: sec2localdate(1440768801.7) = "2015-08-28" با TZ="Asia/Istanbul" sec2localdate(1440768801.7, "Asia/Istanbul") = "2015-08-28" .fi .if n \{\ .RE .SS "sec2localtime" .if n \{\ .RS 0 .\} .nf (class=time #args=1,2,3) ثانیه‌های سپری‌شده از مبدأ زمانی epoch (بخش صحیح) را به صورت برچسب زمانی محلی قالب‌بندی می‌کند. به متغیر محیطی $TZ رجوع می‌کند مگر اینکه آرگومان سوم ارائه شده باشد. مقادیر غیرعددی را دست‌نخورده باقی می‌گذارد. با آرگومان عدد صحیح دوم n، مقدار n رقم اعشار برای بخش ثانیه‌ها لحاظ می‌شود. مثال‌ها: sec2localtime(1234567890) = "2009-02-14 01:31:30" با TZ="Asia/Istanbul" sec2localtime(1234567890.123456) = "2009-02-14 01:31:30" با TZ="Asia/Istanbul" sec2localtime(1234567890.123456, 6) = "2009-02-14 01:31:30.123456" با TZ="Asia/Istanbul" sec2localtime(1234567890.123456, 6, "Asia/Istanbul") = "2009-02-14 01:31:30.123456" .fi .if n \{\ .RE .SS "select" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=2) با دریافت یک مپ (map) یا آرایه به عنوان آرگومان نخست و یک تابع به عنوان آرگومان دوم، در صورتی که تابع true بازگرداند، هر عنصر ورودی را در خروجی قرار می‌دهد. برای آرایه‌ها، تابع باید یک آرگومان برای عنصر آرایه بپذیرد؛ برای مپ‌ها، باید دو آرگومان برای کلید و مقدار عنصر مپ بپذیرد. در هر دو حالت باید یک مقدار بولی بازگرداند. مثال‌ها: مثال آرایه: select([1,2,3,4,5], func(e) {return e >= 3}) مقدار [3, 4, 5] را بازمی‌گرداند. مثال مپ: select({"a":1, "b":3, "c":5}, func(k,v) {return v >= 3}) مقدار {"b":3, "c": 5} را بازمی‌گرداند. .fi .if n \{\ .RE .SS "sgn" .if n \{\ .RS 0 .\} .nf (class=math #args=1) به ترتیب برای ورودی‌های مثبت، صفر و منفی، مقادیر +1، 0 و -1 را برمی‌گرداند. .fi .if n \{\ .RE .SS "sha1" .if n \{\ .RS 0 .\} .nf (class=hashing #args=1) هش SHA1 از یک مقدار رشته‌ای یا بایتی (bytes). .fi .if n \{\ .RE .SS "sha256" .if n \{\ .RS 0 .\} .nf (class=hashing #args=1) هش SHA256 از یک مقدار رشته‌ای یا بایتی (bytes). .fi .if n \{\ .RE .SS "sha512" .if n \{\ .RS 0 .\} .nf (class=hashing #args=1) هش SHA512 از یک مقدار رشته‌ای یا بایتی (bytes). .fi .if n \{\ .RE .SS "sin" .if n \{\ .RS 0 .\} .nf (class=math #args=1) سینوس مثلثاتی. .fi .if n \{\ .RE .SS "sinh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) سینوس هایپربولیک (هذلولوی). .fi .if n \{\ .RE .SS "skewness" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) چولگی نمونه‌ای مقادیر موجود در یک آرایه یا مپ را بازمی‌گرداند. برای آرایه/مپ با طول کمتر از دو، رشته خالی یا همان void را برمی‌گرداند؛ برای انواع داده‌ای غیر از آرایه/مپ، خطا بازمی‌گرداند. مثال: skewness([4,5,9,10,11]) برابر است با -0.2097285 .fi .if n \{\ .RE .SS "sort" .if n \{\ .RS 0 .\} .nf (class=higher-order-functions #args=1-2) با دریافت یک مپ یا آرایه به عنوان آرگومان نخست و پرچم‌های رشته‌ای یا تابع به عنوان آرگومان اختیاری دوم، نسخه‌ای مرتب‌شده از ورودی را بازمی‌گرداند. با یک آرگومان، عناصر آرایه ابتدا با اعداد به صورت عددی و سپس رشته‌ها به صورت الفبایی (lexical) مرتب می‌شوند، و عناصر مپ نیز به همین ترتیب بر اساس کلیدهای مپ مرتب می‌شوند. اگر آرگومان دوم یک رشته باشد، می‌تواند شامل هر یک از پرچم‌های "f" برای الفبایی ("n" برای حالت پیش‌فرض فوق است)، "c" برای الفبایی بدون حساسیت به بزرگی و کوچکی حروف، یا "t" برای ترتیب مرتب‌سازی طبیعی باشد. یک "r" اضافی در آن رشته برای معکوس کردن ترتیب است. یک "v" اضافی در آن رشته به معنای مرتب‌سازی مپ‌ها بر اساس مقدار است، نه بر اساس کلید. اگر آرگومان دوم یک تابع باشد، برای آرایه‌ها باید دو آرگومان a و b را دریافت کند و متناسب با a < b، a == b، یا a > b به ترتیب مقادیر < 0، 0، یا > 0 را برگرداند؛ برای مپ‌ها تابع باید چهار آرگومان ak، av، bk، و bv را دریافت کند و مجدداً با استفاده از کلیدها و مقادیر a و b مقادیر < 0، 0، یا > 0 را بازگرداند. مثال‌ها: مرتب‌سازی پیش‌فرض: sort([3,"A",1,"B",22]) مقدار [1, 3, 20, "A", "B"] را بازمی‌گرداند. توجه کنید که در اینجا اعداد قبل از رشته‌ها قرار می‌گیرند. مرتب‌سازی پیش‌فرض: sort(["E","a","c","B","d"]) مقدار ["B", "E", "a", "c", "d"] را بازمی‌گرداند. توجه کنید که در اینجا حروف بزرگ قبل از حروف کوچک قرار می‌گیرند. صعودی بدون حساسیت به بزرگی و کوچکی: sort(["E","a","c","B","d"], "c") مقدار ["a", "B", "c", "d", "E"] را بازمی‌گرداند. نزولی بدون حساسیت به بزرگی و کوچکی: sort(["E","a","c","B","d"], "cr") مقدار ["E", "d", "c", "B", "a"] را بازمی‌گرداند. مرتب‌سازی طبیعی: sort(["a1","a10","a100","a2","a20","a200"], "t") مقدار ["a1", "a2", "a10", "a20", "a100", "a200"] را بازمی‌گرداند. آرایه با تابع: sort([5,2,3,1,4], func(a,b) {return b <=> a}) مقدار [5,4,3,2,1] را بازمی‌گرداند. مپ با تابع: sort({"c":2,"a":3,"b":1}, func(ak,av,bk,bv) {return bv <=> av}) مقدار {"a":3,"c":2,"b":1} را بازمی‌گرداند. مپ بدون تابع: sort({"c":2,"a":3,"b":1}) مقدار {"a":3,"b":1,"c":2} را بازمی‌گرداند. مپ بدون تابع: sort({"c":2,"a":3,"b":1}, "v") مقدار {"b":1,"c":2,"a":3} را بازمی‌گرداند. مپ بدون تابع: sort({"c":2,"a":3,"b":1}, "vnr") مقدار {"a":3,"c":2,"b":1} را بازمی‌گرداند. .fi .if n \{\ .RE.SS "sort_collection" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) این یک تابع کمکی برای تابع percentiles است؛ لطفاً برای جزئیات به راهنمای برخط آن مراجعه کنید. .fi .if n \{\ .RE .SS "sparkline" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) رشته‌ای از نویسه‌های بلوکی یونیکد (یکی از ▁▂▃▄▅▆▇█ به ازای هر عنصر) را برمی‌گرداند که بزرگی نسبی مقادیر را در یک آرایه یا نگاشت نشان می‌دهد، جهت ایجاد یک نمودار میله‌ای فشرده ASCII/Unicode. برای انواع داده غیرآرایه/غیرنگاشت خطا برمی‌گرداند. مثال‌ها: sparkline([1,2,3,4,5,6,7,8]) برابر است با "▁▂▃▄▅▆▇█" sparkline([3,3,3]) برابر است با "▁▁▁" .fi .if n \{\ .RE .SS "splita" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) رشته را با استنتاج نوع به آرایه تقسیم می‌کند. آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده‌ای است که بر اساس آن تقسیم صورت می‌گیرد. مثال: splita("3,4,5", ",") = [3,4,5] .fi .if n \{\ .RE .SS "splitax" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) رشته را بدون استنتاج نوع به آرایه تقسیم می‌کند. آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده‌ای است که بر اساس آن تقسیم صورت می‌گیرد. مثال: splitax("3,4,5", ",") = ["3","4","5"] .fi .if n \{\ .RE .SS "splitkv" .if n \{\ .RS 0 .\} .nf (class=conversion #args=3) رشته را با جداکننده‌ها و با استنتاج نوع به یک نگاشت (map) تقسیم می‌کند. آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده جفت‌ها است؛ آرگومان سوم جداکننده فیلدها است. مثال: splitkv("a=3,b=4,c=5", "=", ",") = {"a":3,"b":4,"c":5} .fi .if n \{\ .RE .SS "splitkvx" .if n \{\ .RS 0 .\} .nf (class=conversion #args=3) رشته را با جداکننده‌ها و بدون استنتاج نوع به یک نگاشت (map) تقسیم می‌کند (کلیدها و مقادیر رشته هستند). آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده جفت‌ها است؛ آرگومان سوم جداکننده فیلدها است. مثال: splitkvx("a=3,b=4,c=5", "=", ",") = {"a":"3","b":"4","c":"5"} .fi .if n \{\ .RE .SS "splitnv" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) رشته را با جداکننده و با استنتاج نوع به یک نگاشت (map) با نمایه‌های عدد صحیح تقسیم می‌کند. آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده‌ای است که بر اساس آن تقسیم صورت می‌گیرد. مثال: splitnv("a,b,c", ",") = {"1":"a","2":"b","3":"c"} .fi .if n \{\ .RE .SS "splitnvx" .if n \{\ .RS 0 .\} .nf (class=conversion #args=2) رشته را با جداکننده و بدون استنتاج نوع به یک نگاشت (map) با نمایه‌های عدد صحیح تقسیم می‌کند (مقادیر رشته هستند). آرگومان اول رشته‌ای است که باید تقسیم شود؛ آرگومان دوم جداکننده‌ای است که بر اساس آن تقسیم صورت می‌گیرد. مثال: splitnvx("3,4,5", ",") = {"1":"3","2":"4","3":"5"} .fi .if n \{\ .RE .SS "sqrt" .if n \{\ .RS 0 .\} .nf (class=math #args=1) ریشه دوم (جذر). .fi .if n \{\ .RE .SS "ssub" .if n \{\ .RS 0 .\} .nf (class=string #args=3) مانند sub عمل می‌کند اما عبارات منظم (regex) را اعمال نمی‌کند. هیچ نویسه‌ای خاص نیست. مثال: ssub("abc.def", ".", "X") خروجی می‌دهد "abcXdef" .fi .if n \{\ .RE .SS "stat" .if n \{\ .RS 0 .\} .nf (class=system #args=1) یک نگاشت حاوی اطلاعات مربوط به مسیر ارائه‌شده را برمی‌گرداند: "name" با مقدار رشته‌ای، "size" به عنوان مقدار ده‌دهی int، "mode" به عنوان مقدار هشت‌هشتی (octal) int، "modtime" به عنوان ثانیه‌های مبدأ (epoch) با نوع int، و "isdir" به عنوان یک مقدار بولی (boolean). مثال‌ها: stat("./mlr") خروجی می‌دهد { "name": "mlr", "size": 38391584, "mode": 0755, "modtime": 1715207874, "isdir": false } stat("./mlr")["size"] خروجی می‌دهد 38391584 .fi .if n \{\ .RE.SS "stddev" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) انحراف معیار نمونه‌ای مقادیر را در یک آرایه یا نگاشت برمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشته خالی (معروف به void) را برمی‌گرداند؛ برای انواع غیر آرایه/غیر نگاشت خطا برمی‌گرداند. مثال: stddev([4,5,9,10,11]) is 3.1144823 .fi .if n \{\ .RE .SS "strfntime" .if n \{\ .RS 0 .\} .nf (class=time #args=2) نانوثانیه‌های عدد صحیح از مبدأ زمانی (epoch) را به صورت برچسب زمان قالب‌بندی می‌کند. رشته‌های قالب‌بندی همانند آنچه در https://pkg.go.dev/github.com/lestrrat-go/strftime آمده است هستند، به همراه افزوده اختصاصی Miller یعنی "%1S" تا "%9S" که ثانیه‌ها را به ترتیب با ۱ تا ۹ رقم اعشار قالب‌بندی می‌کنند. ("%S" از هیچ رقم اعشاری استفاده نمی‌کند.) همچنین برای اطلاعات بیشتر درباره تفاوت‌ها با کتابخانه C (دستور "man strftime" در سیستم شما) به https://miller.readthedocs.io/en/latest/reference-dsl-time مراجعه کنید. همچنین strftime_local را ببینید. مثال‌ها: strfntime(1440768801123456789,"%Y-%m-%dT%H:%M:%SZ") = "2015-08-28T13:33:21Z" strfntime(1440768801123456789,"%Y-%m-%dT%H:%M:%3SZ") = "2015-08-28T13:33:21.123Z" strfntime(1440768801123456789,"%Y-%m-%dT%H:%M:%6SZ") = "2015-08-28T13:33:21.123456Z" .fi .if n \{\ .RE .SS "strfntime_local" .if n \{\ .RS 0 .\} .nf (class=time #args=2,3) شبیه به strfntime است اما برای دریافت منطقه زمانی محلی از متغیر محیطی $TZ استفاده می‌کند. مثال‌ها: strfntime_local(1440768801123456789, "%Y-%m-%d %H:%M:%S %z") = "2015-08-28 16:33:21 +0300" with TZ="Asia/Istanbul" strfntime_local(1440768801123456789, "%Y-%m-%d %H:%M:%3S %z") = "2015-08-28 16:33:21.123 +0300" with TZ="Asia/Istanbul" strfntime_local(1440768801123456789, "%Y-%m-%d %H:%M:%3S %z", "Asia/Istanbul") = "2015-08-28 16:33:21.123 +0300" strfntime_local(1440768801123456789, "%Y-%m-%d %H:%M:%9S %z", "Asia/Istanbul") = "2015-08-28 16:33:21.123456789 +0300" .fi .if n \{\ .RE .SS "strftime" .if n \{\ .RS 0 .\} .nf (class=time #args=2) ثانیه‌های سپری‌شده از مبدأ زمانی (epoch) را به عنوان برچسب زمان قالب‌بندی می‌کند. رشته‌های قالب‌بندی همانند آنچه در https://pkg.go.dev/github.com/lestrrat-go/strftime آمده است هستند، به همراه افزوده اختصاصی Miller یعنی "%1S" تا "%9S" که ثانیه‌ها را به ترتیب با ۱ تا ۹ رقم اعشار قالب‌بندی می‌کنند. ("%S" از هیچ رقم اعشاری استفاده نمی‌کند.) همچنین برای اطلاعات بیشتر درباره تفاوت‌ها با کتابخانه C (دستور "man strftime" در سیستم شما) به https://miller.readthedocs.io/en/latest/reference-dsl-time مراجعه کنید. همچنین strftime_local را ببینید. مثال‌ها: strftime(1440768801.7,"%Y-%m-%dT%H:%M:%SZ") = "2015-08-28T13:33:21Z" strftime(1440768801.7,"%Y-%m-%dT%H:%M:%3SZ") = "2015-08-28T13:33:21.700Z" .fi .if n \{\ .RE .SS "strftime_local" .if n \{\ .RS 0 .\} .nf (class=time #args=2,3) مانند strftime است اما برای دریافت منطقه زمانی محلی از متغیر محیطی $TZ استفاده می‌کند. مثال‌ها: strftime_local(1440768801.7, "%Y-%m-%d %H:%M:%S %z") = "2015-08-28 16:33:21 +0300" with TZ="Asia/Istanbul" strftime_local(1440768801.7, "%Y-%m-%d %H:%M:%3S %z") = "2015-08-28 16:33:21.700 +0300" with TZ="Asia/Istanbul" strftime_local(1440768801.7, "%Y-%m-%d %H:%M:%3S %z", "Asia/Istanbul") = "2015-08-28 16:33:21.700 +0300" .fi .if n \{\ .RE .SS "string" .if n \{\ .RS 0 .\} .nf (class=conversion #args=1) تبدیل int/float/bool/string/array/map به رشته (string). برای مقادیر بایتی، بایت‌های خام را مجدداً به عنوان یک رشته (UTF-8) تفسیر می‌کند -- معکوس ()bytes. .fi .if n \{\ .RE .SS "strip" .if n \{\ .RS 0 .\} .nf (class=string #args=1) فاصله‌ها و نویسه‌های خالی (whitespace) ابتدا و انتهای رشته را حذف می‌کند. .fi .if n \{\ .RE .SS "strlen" .if n \{\ .RS 0 .\} .nf (class=string #args=1) طول رشته بر حسب نویسه‌های UTF-8، یا طول مقادیر بایتی بر حسب بایت. .fi .if n \{\ .RE .SS "strmatch" .if n \{\ .RS 0 .\} .nf (class=string #args=2) مقدار بولی بله/خیر برای اینکه آیا آرگومان اولِ تبدیل‌پذیر به رشته با عبارت باقاعده در آرگومان دوم مطابقت دارد یا خیر. هیچ گروه دریافتی (capture) از regex ارائه نمی‌شود؛ لطفاً `strmatch` را ببینید. مثال‌ها: strmatch("a", "abc") is false strmatch("abc", "a") is true strmatch("abc", "a[a-z]c") is true strmatch("abc", "(a).(c)") is true strmatch(12345, "34") is true .fi .if n \{\ .RE .SS "strmatchx" .if n \{\ .RS 0 .\} .nf (class=string #args=2) اطلاعات تکمیلی برای اینکه آیا آرگومان اولِ تبدیل‌پذیر به رشته با عبارت باقاعده در آرگومان دوم مطابقت دارد یا خیر. گروه‌های ضبط regex در نگاشت مقدار بازگشتی ارائه می‌شوند؛ بر خلاف عملگر `=~`، متغیرهای \e1، \e2 و غیره مقداردهی نمی‌شوند. همچنین، در حالی که عملگر `=~` تطابق‌ها را به \e1 تا \e9 محدود می‌کند، در اینجا تعداد نامحدودی پشتیبانی می‌شود. مثال‌ها: strmatchx("a", "abc") returns: { "matched": false } strmatchx("abc", "a") returns: { "matched": true, "full_capture": "a", "full_start": 1, "full_end": 1 } strmatchx("[zy:3458]", "([a-z]+):([0-9]+)") returns: { "matched": true, "full_capture": "zy:3458", "full_start": 2, "full_end": 8, "captures": ["zy", "3458"], "starts": [2, 5], "ends": [3, 8] } .fi .if n \{\ .RE.SS "strpntime" .if n \{\ .RS 0 .\} .nf (class=time #args=2) strpntime: برچسب زمانی را به صورت عدد صحیح نانوثانیه از مبدأ زمان (epoch) تجزیه می‌کند. همچنین strpntime_local را ببینید. مثال‌ها: strpntime("2015-08-28T13:33:21Z", "%Y-%m-%dT%H:%M:%SZ") = 1440768801000000000 strpntime("2015-08-28T13:33:21.345Z", "%Y-%m-%dT%H:%M:%SZ") = 1440768801345000000 strpntime("1970-01-01 00:00:00 -0400", "%Y-%m-%d %H:%M:%S %z") = 14400000000000 strpntime("1970-01-01 00:00:00 +0200", "%Y-%m-%d %H:%M:%S %z") = -7200000000000 .fi .if n \{\ .RE .SS "strpntime_local" .if n \{\ .RS 0 .\} .nf (class=time #args=2,3) مانند strpntime است اما برای دریافت منطقه زمانی محلی، متغیر محیطی $TZ را بررسی می‌کند. مثال‌ها: strpntime_local("2015-08-28T13:33:21Z", "%Y-%m-%dT%H:%M:%SZ") = 1440758001000000000 with TZ="Asia/Istanbul" strpntime_local("2015-08-28T13:33:21.345Z","%Y-%m-%dT%H:%M:%SZ") = 1440758001345000000 with TZ="Asia/Istanbul" strpntime_local("2015-08-28 13:33:21", "%Y-%m-%d %H:%M:%S") = 1440758001000000000 with TZ="Asia/Istanbul" strpntime_local("2015-08-28 13:33:21", "%Y-%m-%d %H:%M:%S", "Asia/Istanbul") = 1440758001000000000 .fi .if n \{\ .RE .SS "strptime" .if n \{\ .RS 0 .\} .nf (class=time #args=2) strptime: برچسب زمانی را به صورت ثانیه‌های ممیز شناور از مبدأ زمان (epoch) تجزیه می‌کند. همچنین strptime_local را ببینید. مثال‌ها: strptime("2015-08-28T13:33:21Z", "%Y-%m-%dT%H:%M:%SZ") = 1440768801.000000 strptime("2015-08-28T13:33:21.345Z", "%Y-%m-%dT%H:%M:%SZ") = 1440768801.345000 strptime("1970-01-01 00:00:00 -0400", "%Y-%m-%d %H:%M:%S %z") = 14400 strptime("1970-01-01 00:00:00 +0200", "%Y-%m-%d %H:%M:%S %z") = -7200 .fi .if n \{\ .RE .SS "strptime_local" .if n \{\ .RS 0 .\} .nf (class=time #args=2,3) مانند strptime است اما برای دریافت منطقه زمانی محلی، متغیر محیطی $TZ را بررسی می‌کند. مثال‌ها: strptime_local("2015-08-28T13:33:21Z", "%Y-%m-%dT%H:%M:%SZ") = 1440758001 with TZ="Asia/Istanbul" strptime_local("2015-08-28T13:33:21.345Z","%Y-%m-%dT%H:%M:%SZ") = 1440758001.345 with TZ="Asia/Istanbul" strptime_local("2015-08-28 13:33:21", "%Y-%m-%d %H:%M:%S") = 1440758001 with TZ="Asia/Istanbul" strptime_local("2015-08-28 13:33:21", "%Y-%m-%d %H:%M:%S", "Asia/Istanbul") = 1440758001 .fi .if n \{\ .RE .SS "sub" .if n \{\ .RS 0 .\} .nf (class=string #args=3) '$name = sub($name, "old", "new")': جایگزینی یک‌باره (اولین تطابق، در صورت وجود چندین تطابق)، با پشتیبانی از عبارت‌های باقاعده. گروه‌های گیرش \e1 تا \e9 در بخش new از (...) در بخش old تطبیق داده می‌شوند و باید درون همان فراخوانی sub استفاده شوند -- آن‌ها برای دستورهای بعدی DSL باقی نمی‌مانند. همچنین =~ و regextract را ببینید. همچنین «Regular expressions» را در https://miller.readthedocs.io ببینید. مثال‌ها: sub("ababab", "ab", "XY") gives "XYabab" sub("abc.def", ".", "X") gives "Xbc.def" sub("abc.def", "\e.", "X") gives "abcXdef" sub("abcdefg", "[ce]", "X") gives "abXdefg" sub("prefix4529:suffix8567", "suffix([0-9]+)", "name\e1") gives "prefix4529:name8567" .fi .if n \{\ .RE .SS "substr" .if n \{\ .RS 0 .\} .nf (class=string #args=3) تابع substr نام مستعاری برای substr0 است. همچنین substr1 را ببینید. Miller به‌طور کلی برای تمام اندیس‌های آرایه و رشته بر پایه ۱ (1-up) عمل می‌کند، اما این مورد برای حفظ سازگاری رو به عقب با Miller نسخه ۵ و پایین‌تر است. آرایه‌ها در Miller 6 جدید هستند؛ تابع substr قدیمی‌تر است. .fi .if n \{\ .RE .SS "substr0" .if n \{\ .RS 0 .\} .nf (class=string #args=3) عبارت substr0(s,m,n) زیررشته‌ای از s را از موقعیت مبنای صفر m تا خود n (شامل هر دو) برمی‌گرداند. اندیس‌های منفی -len .. -1 معادل 0 .. len-1 هستند. همچنین substr و substr1 را ببینید. .fi .if n \{\ .RE .SS "substr1" .if n \{\ .RS 0 .\} .nf (class=string #args=3) عبارت substr1(s,m,n) زیررشته‌ای از s را از موقعیت مبنای یک m تا خود n (شامل هر دو) برمی‌گرداند. اندیس‌های منفی -len .. -1 معادل 1 .. len هستند. همچنین substr و substr0 را ببینید. .fi .if n \{\ .RE .SS "sum" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) مجموع مقادیر موجود در یک آرایه یا نگاشت (map) را برمی‌گرداند. برای نوع‌های غیر آرایه/غیر نگاشت خطا برمی‌گرداند. مثال: sum([1,2,3,4,5]) is 15 .fi .if n \{\ .RE .SS "sum2" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) مجموع مربعات مقادیر موجود در یک آرایه یا نگاشت (map) را برمی‌گرداند. برای نوع‌های غیر آرایه/غیر نگاشت خطا برمی‌گرداند. مثال: sum2([1,2,3,4,5]) is 55 .fi .if n \{\ .RE.SS "sum3" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) مجموع مکعب‌های مقادیر موجود در یک آرایه یا نگاشت (map) را بازمی‌گرداند. برای انواع غیرآرایه‌ای/غیرنگاشتی خطا بازمی‌گرداند. مثال: sum3([1,2,3,4,5]) برابر است با 225 .fi .if n \{\ .RE .SS "sum4" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) مجموع توان‌های چهارم مقادیر موجود در یک آرایه یا نگاشت (map) را بازمی‌گرداند. برای انواع غیرآرایه‌ای/غیرنگاشتی خطا بازمی‌گرداند. مثال: sum4([1,2,3,4,5]) برابر است با 979 .fi .if n \{\ .RE .SS "sysntime" .if n \{\ .RS 0 .\} .nf (class=time #args=0) زمان سیستم را بر حسب نانوثانیه ۶۴ بیتی از مبدأ زمان (epoch) بازمی‌گرداند. .fi .if n \{\ .RE .SS "system" .if n \{\ .RS 0 .\} .nf (class=system #args=1) رشته دستور را اجرا کرده و خروجی استاندارد (stdout) آن را منهای کاراکتر بازگشت به ابتدای سطر (CR) نهایی بازمی‌گرداند. .fi .if n \{\ .RE .SS "systime" .if n \{\ .RS 0 .\} .nf (class=time #args=0) زمان سیستم را بر حسب ثانیه‌های ممیز شناور از مبدأ زمان (epoch) بازمی‌گرداند. .fi .if n \{\ .RE .SS "systimeint" .if n \{\ .RS 0 .\} .nf (class=time #args=0) زمان سیستم را بر حسب ثانیه‌های عدد صحیح از مبدأ زمان (epoch) بازمی‌گرداند. .fi .if n \{\ .RE .SS "tan" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تانژانت مثلثاتی. .fi .if n \{\ .RE .SS "tanh" .if n \{\ .RS 0 .\} .nf (class=math #args=1) تانژانت هذلولوی (هایپربولیک). .fi .if n \{\ .RE .SS "tolower" .if n \{\ .RS 0 .\} .nf (class=string #args=1) تبدیل رشته به حروف کوچک. .fi .if n \{\ .RE .SS "toupper" .if n \{\ .RS 0 .\} .nf (class=string #args=1) تبدیل رشته به حروف بزرگ. .fi .if n \{\ .RE .SS "truncate" .if n \{\ .RS 0 .\} .nf (class=string #args=2) رشته آرگومان اول را به حداکثر طول عدد صحیح مشخص‌شده در آرگومان دوم کوتاه می‌کند. .fi .if n \{\ .RE .SS "typeof" .if n \{\ .RS 0 .\} .nf (class=typing #args=1) آرگومان را به نوع داده آن (مانند "str") تبدیل می‌کند. برای اشکال‌زدایی (debug). .fi .if n \{\ .RE .SS "unflatten" .if n \{\ .RS 0 .\} .nf (class=collections #args=2) عملکرد flatten را معکوس می‌کند. برای ساختارهای تودرتوی شبه-JSON در قالب‌های فایل غیر-JSON مانند CSV مفید است. آرگومان نخست یک نگاشت (map) و آرگومان دوم جداکننده مسطح‌سازی است. همچنین arrayify را ببینید. برای اطلاعات بیشتر «Flatten/unflatten: converting between JSON and tabular formats» را در https://miller.readthedocs.io ببینید. مثال: unflatten({"a.b.c" : 4}, ".") برابر است با {"a": "b": { "c": 4 }}. .fi .if n \{\ .RE.SS "unformat" .if n \{\ .RS 0 .\} .nf (class=string #args=2) با استفاده از آرگومان نخست به عنوان رشته قالب، آرگومان دوم را با استنتاج نوع به آرایه‌ای از تطابق‌ها تجزیه می‌کند. در صورت عدم تطابق، خطا برمی‌گرداند -- برای بررسی از is_error() استفاده کنید. مثال‌ها: unformat("{}:{}:{}", "1:2:3") مقدار [1, 2, 3] را برمی‌گرداند. unformat("{}h{}m{}s", "3h47m22s") مقدار [3, 47, 22] را برمی‌گرداند. is_error(unformat("{}h{}m{}s", "3:47:22")) مقدار true را برمی‌گرداند. .fi .if n \{\ .RE .SS "unformatx" .if n \{\ .RS 0 .\} .nf (class=string #args=2) مشابه unformat، اما بدون استنتاج نوع. مثال‌ها: unformatx("{}:{}:{}", "1:2:3") مقدار ["1", "2", "3"] را برمی‌گرداند. unformatx("{}h{}m{}s", "3h47m22s") مقدار ["3", "47", "22"] را برمی‌گرداند. is_error(unformatx("{}h{}m{}s", "3:47:22")) مقدار true را برمی‌گرداند. .fi .if n \{\ .RE .SS "upntime" .if n \{\ .RS 0 .\} .nf (class=time #args=0) زمان سپری‌شده از هنگام شروع برنامهٔ جاری Miller را بر حسب نانوثانیه‌های ۶۴ بیتی برمی‌گرداند. .fi .if n \{\ .RE .SS "uptime" .if n \{\ .RS 0 .\} .nf (class=time #args=0) زمان سپری‌شده از هنگام شروع برنامهٔ جاری Miller را بر حسب ثانیه‌های ممیز شناور برمی‌گرداند. .fi .if n \{\ .RE .SS "urand" .if n \{\ .RS 0 .\} .nf (class=math #args=0) اعداد ممیز شناور با توزیع یکنواخت در بازه یکه. مثال: مثال با مقدار عدد صحیح: '$n=floor(20+urand()*11)'. .fi .if n \{\ .RE .SS "urand32" .if n \{\ .RS 0 .\} .nf (class=math #args=0) عدد صحیح با توزیع یکنواخت بین 0 و 2**32-1 (شامل هر دو). .fi .if n \{\ .RE .SS "urandelement" .if n \{\ .RS 0 .\} .nf (class=math #args=1) نمونه تصادفی از آرگومان نخست، که باید یک آرایهٔ غیرخالی باشد. .fi .if n \{\ .RE .SS "urandint" .if n \{\ .RS 0 .\} .nf (class=math #args=2) عدد صحیح با توزیع یکنواخت بین نقاط انتهایی صحیح (شامل هر دو نقطه پایانی). .fi .if n \{\ .RE .SS "urandrange" .if n \{\ .RS 0 .\} .nf (class=math #args=2) اعداد ممیز شناور با توزیع یکنواخت در بازه [a, b). .fi .if n \{\ .RE .SS "utf8_to_latin1" .if n \{\ .RS 0 .\} .nf (class=string #args=1) تلاش می‌کند رشته با کدگذاری UTF-8 را به رشته با کدگذاری Latin-1 تبدیل کند. اگر آرگومان آرایه یا نگاشت (map) باشد، به طور بازگشتی به درون آن پیمایش می‌کند. مثال‌ها: $y = utf8_to_latin1($x) $* = utf8_to_latin1($*) .fi .if n \{\ .RE .SS "variance" .if n \{\ .RS 0 .\} .nf (class=stats #args=1) واریانس نمونه مقادیر در یک آرایه یا نگاشت (map) را برمی‌گرداند. برای آرایه/نگاشت با طول کمتر از دو، رشته خالی (void) برمی‌گرداند؛ برای انواع غیر آرایه/غیر نگاشت خطا برمی‌گرداند. مثال: variance([4,5,9,10,11]) برابر است با 9.7 .fi .if n \{\ .RE .SS "version" .if n \{\ .RS 0 .\} .nf (class=system #args=0) نسخه Miller را به عنوان یک رشته برمی‌گرداند. .fi .if n \{\ .RE.SS "!" .if n \{\ .RS 0 .\} .nf (class=boolean #args=1) نقیض منطقی. .fi .if n \{\ .RE .SS "!=" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) نابرابری رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS "!=~" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) رشته (سمت چپ) با عبارت باقاعده (سمت راست) مطابقت ندارد، مانند '$name !=~ "^a.*b$"'. .fi .if n \{\ .RE .SS "%" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) باقی‌مانده؛ هرگز مقدار منفی ندارد (مشابه پایتون). .fi .if n \{\ .RE .SS "&" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) AND بیتی. .fi .if n \{\ .RE .SS "&&" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) AND منطقی. .fi .if n \{\ .RE .SS "*" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) ضرب، با سرریز integer*integer به float. .fi .if n \{\ .RE .SS "**" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) توان‌رسانی. مشابه pow، اما به عنوان عملگر میان‌وند. .fi .if n \{\ .RE .SS "+" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=1,2) جمع به عنوان عملگر دودویی؛ عملگر مثبت یکانی. .fi .if n \{\ .RE .SS "-" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=1,2) تفریق به عنوان عملگر دودویی؛ عملگر منفی‌ساز یکانی. .fi .if n \{\ .RE .SS "." .if n \{\ .RS 0 .\} .nf (class=string #args=2) الحاق رشته. مقادیر غیررشته‌ای تبدیل نوع می‌شوند (coerced)، بنابراین می‌توانید مواردی مانند '"ax".98' و غیره را انجام دهید. .fi .if n \{\ .RE .SS ".*" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) ضرب، با سرریز integer-to-integer. .fi .if n \{\ .RE .SS ".+" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) جمع، با سرریز integer-to-integer. .fi .if n \{\ .RE .SS ".-" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) تفریق، با سرریز integer-to-integer. .fi .if n \{\ .RE.SS "./" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) تقسیم عدد صحیح، با گرد کردن به سمت صفر. .fi .if n \{\ .RE .SS "/" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) تقسیم. عدد صحیح / عدد صحیح در صورت دقیق بودن عدد صحیح است، در غیر این صورت ممیز شناور: مثلاً 6/3 برابر 2 است اما 6/4 برابر 1.5 است. .fi .if n \{\ .RE .SS "//" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) تقسیم عدد صحیح پایتونی، با گرد کردن به سمت منفی. .fi .if n \{\ .RE .SS "<" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) کوچکتری رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS "<<" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) شیفت بیتی به چپ. .fi .if n \{\ .RE .SS "<=" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) کوچکتری یا مساوی رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS "<=>" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) مقایسه‌گر، اسماً برای مرتب‌سازی. با فرض a <=> b، به ترتیب مقادیر <0، 0، >0 را بر اساس a < b، a == b یا a > b برمی‌گرداند. .fi .if n \{\ .RE .SS "==" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) برابری رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS "=~" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) تطابق رشته (سمت چپ) با regex (سمت راست)، مثلاً '$name =~ "^a.*b$"'. گروه‌های ضبط \e1 تا \e9 از (...) در سمت راست تطبیق داده می‌شوند و می‌توان درون دستورهای بعدی DSL از آن‌ها استفاده کرد. همچنین «Regular expressions» را در https://miller.readthedocs.io ببینید. مثال‌ها: با دستور if: if ($url =~ "http.*com") { ... } بدون دستور if: با فرض $line = "index ab09 file" و $line =~ "([a-z][a-z])([0-9][0-9])"، آنگاه با $label = "[\e1:\e2]"، مقدار $label برابر "[ab:09]" خواهد بود .fi .if n \{\ .RE .SS ">" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) بزرگتری رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS ">=" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) بزرگتری یا مساوی رشته‌ای/عددی. ترکیب عدد و رشته منجر به مقایسه رشته‌ای می‌شود. .fi .if n \{\ .RE .SS ">>" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) شیفت بیتی به راست علامت‌دار. .fi .if n \{\ .RE .SS ">>>" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) شیفت بیتی به راست بدون علامت. .fi .if n \{\ .RE.SS "?:" .if n \{\ .RS 0 .\} .nf (class=boolean #args=3) عملگر سه‌تایی استاندارد. .fi .if n \{\ .RE .SS "??" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) عملگر ادغام ناموجود (absent-coalesce). چنانچه $a در رکورد فعلی تعریف نشده باشد، $a ?? 1 به 1 ارزیابی می‌شود. .fi .if n \{\ .RE .SS "???" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) عملگر ادغام ناموجود/خالی (absent/empty-coalesce). چنانچه $a در رکورد فعلی تعریف نشده باشد یا مقداری خالی داشته باشد، $a ??? 1 به 1 ارزیابی می‌شود. .fi .if n \{\ .RE .SS "^" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) عملگر XOR بیتی. .fi .if n \{\ .RE .SS "^^" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) عملگر XOR منطقی. .fi .if n \{\ .RE .SS "|" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=2) عملگر OR بیتی. .fi .if n \{\ .RE .SS "||" .if n \{\ .RS 0 .\} .nf (class=boolean #args=2) عملگر OR منطقی. .fi .if n \{\ .RE .SS "~" .if n \{\ .RS 0 .\} .nf (class=arithmetic #args=1) عملگر NOT بیتی. مراقب '$y=~$x' باشید، زیرا =~ عملگر تطابق با عبارت باقاعده (regex-match) است؛ به‌جای آن '$y = ~$x' را امتحان کنید. .fi .if n \{\ .RE .SH "کلیدواژه‌ها برای PUT و FILTER (KEYWORDS FOR PUT AND FILTER)" .sp .SS "all" .if n \{\ .RS 0 .\} .nf all: در "emit1"، "emit"، "emitp" و "unset" به‌عنوان مترادفی برای @* استفاده می‌شود. .fi .if n \{\ .RE .SS "begin" .if n \{\ .RS 0 .\} .nf begin: بلوکی از دستورها را تعریف می‌کند که باید پیش از پردازش رکوردهای ورودی اجرا شوند. دستورهای بدنه باید در آکولاد محصور شوند. مثال: 'begin { @count = 0 }' .fi .if n \{\ .RE .SS "bool" .if n \{\ .RS 0 .\} .nf bool: یک متغیر محلی بولی (boolean) را در محدودهٔ (scope) آکولادی فعلی اعلان می‌کند. بررسی نوع در زمان مقداردهی انجام می‌شود: 'bool b = 1' یک خطا است. .fi .if n \{\ .RE .SS "break" .if n \{\ .RS 0 .\} .nf break: باعث می‌شود اجرای برنامه پس از بدنهٔ حلقهٔ for/while/do-while فعلی ادامه یابد. .fi .if n \{\ .RE .SS "call" .if n \{\ .RS 0 .\} .nf call: برای فراخوانی یک زیرروال (subroutine) تعریف‌شده توسط کاربر استفاده می‌شود. مثال: 'subr s(k,v) { print k . " is " . v} call s("a", $a)' .fi .if n \{\ .RE.SS "continue" .if n \{\ .RS 0 .\} .nf continue: باعث می‌شود اجرای دستورات باقی‌مانده در بدنهٔ حلقهٔ جاری for/while/do-while نادیده گرفته شود. گام‌های افزایشی حلقهٔ for همچنان اعمال می‌شوند. .fi .if n \{\ .RE .SS "do" .if n \{\ .RS 0 .\} .nf do: با "while"، یک حلقهٔ do-while را معرفی می‌کند. دستورات بدنه باید درون آکولادها محصور شوند. .fi .if n \{\ .RE .SS "dump" .if n \{\ .RS 0 .\} .nf dump: تمام متغیرهای خارج از جریان (out-of-stream) تعریف‌شده در حال حاضر را بلافاصله به‌صورت JSON در stdout چاپ می‌کند. با >، >>، یا |، داده‌ها مستقیماً به stdout نمی‌روند بلکه در عوض تغییر مسیر داده می‌شوند (redirect می‌شوند). عملگرهای > و >> همانند شل برای نوشتن (write) و الحاق (append) هستند، اما (همانند awk) بازنویسی فایل برای > در اولین نوشتن انجام می‌شود، نه به ازای هر رکورد. عملگر | برای ارسال با لوله‌کشی (pipe) به فرایندی است که داده‌ها را پردازش خواهد کرد. به ازای هر نام فایل متمایز، یک فایل باز وجود خواهد داشت (برای > و >>) یا یک فرایند فرعی به ازای هر مقدار متمایز از دستور لوله‌کشی‌شده (برای |). گزینه‌های قالب‌بندی خروجی از خط فرمان اصلی گرفته می‌شوند. مثال: mlr --from f.dat put -q '@v[NR]=$*; end { dump }' مثال: mlr --from f.dat put -q '@v[NR]=$*; end { dump > "mytap.dat"}' مثال: mlr --from f.dat put -q '@v[NR]=$*; end { dump >> "mytap.dat"}' مثال: mlr --from f.dat put -q '@v[NR]=$*; end { dump | "jq .[]"}' .fi .if n \{\ .RE .SS "edump" .if n \{\ .RS 0 .\} .nf edump: تمام متغیرهای خارج از جریان (out-of-stream) تعریف‌شده در حال حاضر را بلافاصله به‌صورت JSON در stderr چاپ می‌کند. مثال: mlr --from f.dat put -q '@v[NR]=$*; end { edump }' .fi .if n \{\ .RE .SS "elif" .if n \{\ .RS 0 .\} .nf elif: شیوهٔ نگارش "else if" در Miller است. دستورات بدنه باید درون آکولادها محصور شوند. .fi .if n \{\ .RE .SS "else" .if n \{\ .RS 0 .\} .nf else: به یک زنجیرهٔ if/elif/elif خاتمه می‌دهد. دستورات بدنه باید درون آکولادها محصور شوند. .fi .if n \{\ .RE .SS "emit1" .if n \{\ .RS 0 .\} .nf emit1: یک متغیر خارج از جریان را درون جریان رکوردهای خروجی درج می‌کند. برعکس سایر گونه‌های map، حالت‌های کنار هم (side-by-sides)، نمایه‌گذاری (indexing) و تغییر مسیر پشتیبانی نمی‌شوند، اما می‌توانید هر عبارت با مقدار map را درج (emit) کنید. مثال: mlr --from f.dat put 'emit1 $*' مثال: mlr --from f.dat put 'emit1 mapsum({"id": NR}, $*)' لطفاً برای اطلاعات بیشتر https://miller.readthedocs.io://johnkerl.org/miller/doc را ببینید. .fi .if n \{\ .RE .SS "emit" .if n \{\ .RS 0 .\} .nf emit: یک متغیر خارج از جریان را درون جریان رکوردهای خروجی درج می‌کند. نمایه‌های hashmap موجود در داده‌ها که توسط آرگومان‌های emit تعیین نشده‌اند در خروجی درج نمی‌شوند. با >، >>، یا |، داده‌ها بخشی از جریان رکوردهای خروجی نخواهند شد بلکه در عوض تغییر مسیر داده می‌شوند. عملگرهای > و >> همانند شل برای نوشتن و الحاق هستند، اما (همانند awk) بازنویسی فایل برای > در اولین نوشتن انجام می‌شود، نه به ازای هر رکورد. عملگر | برای لوله‌کشی به فرایندی است که داده‌ها را پردازش خواهد کرد. به ازای هر نام فایل متمایز، یک فایل باز وجود خواهد داشت (برای > و >>) یا یک فرایند فرعی به ازای هر مقدار متمایز از دستور لوله‌کشی‌شده (برای |). گزینه‌های قالب‌بندی خروجی از خط فرمان اصلی گرفته می‌شوند. می‌توانید از هر یک از گزینه‌های خط فرمان قالب خروجی، مانند --ocsv ،--ofs و غیره، برای کنترل قالب خروجی در صورت تغییر مسیر استفاده کنید. همچنین mlr -h را ببینید. مثال: mlr --from f.dat put 'emit > "/tmp/data-".$a, $*' مثال: mlr --from f.dat put 'emit > "/tmp/data-".$a, mapexcept($*, "a")' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums' مثال: mlr --from f.dat put --ojson '@sums[$a][$b]+=$x; emit > "tap-".$a.$b.".dat", @sums' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > "mytap.dat", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit >> "mytap.dat", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "gzip > mytap.dat.gz", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > stderr, @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "grep somepattern", @*, "index1", "index2"' لطفاً برای اطلاعات بیشتر https://miller.readthedocs.io://johnkerl.org/miller/doc را ببینید. .fi .if n \{\ .RE.SS "emitf" .if n \{\ .RS 0 .\} .nf emitf: متغیر(های) بدون اندیس خارج از جریان را کنار یکدیگر در جریان رکوردهای خروجی درج می‌کند. با >، >> یا |، داده‌ها بخشی از جریان رکوردهای خروجی نمی‌شوند بلکه در عوض بازهدایت می‌گردند. عملگرهای > و >> همانند شل برای نوشتن و الحاق هستند، اما (مانند awk) رونویسی فایل برای > در اولین نوشتن انجام می‌شود، نه به ازای هر رکورد. عملگر | برای ارسال از طریق لوله به فرایندی است که داده‌ها را پردازش خواهد کرد. برای هر نام فایل متمایز (برای > و >>) یک فایل باز، یا برای هر مقدار متمایز از دستور ارسال‌شده از طریق لوله (برای |) یک فرایند زیرمجموعه وجود خواهد داشت. گزینه‌های قالب‌بندی خروجی از خط فرمان اصلی گرفته می‌شوند. می‌توانید از هر یک از گزینه‌های خط فرمان قالب‌بندی خروجی، مانند --ocsv، --ofs و غیره برای کنترل قالب خروجی در صورت بازهدایت آن استفاده کنید. همچنین mlr -h را ببینید. مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a' مثال: mlr --from f.dat put --oxtab '@a=$i;@b+=$x;@c+=$y; emitf > "tap-".$i.".dat", @a' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a, @b, @c' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > "mytap.dat", @a, @b, @c' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf >> "mytap.dat", @a, @b, @c' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > stderr, @a, @b, @c' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern", @a, @b, @c' مثال: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern > mytap.dat", @a, @b, @c' لطفاً برای اطلاعات بیشتر https://miller.readthedocs.io://johnkerl.org/miller/doc را ببینید. .fi .if n \{\ .RE .SS "emitp" .if n \{\ .RS 0 .\} .nf emitp: یک متغیر خارج از جریان را در جریان رکوردهای خروجی درج می‌کند. نمایه‌های Hashmap موجود در داده‌ها که توسط آرگومان‌های emitp جای‌گذاری نشده‌اند، به‌صورت ادغام‌شده با «:» خروجی داده می‌شوند. با >، >> یا |، داده‌ها بخشی از جریان رکوردهای خروجی نمی‌شوند بلکه در عوض بازهدایت می‌گردند. عملگرهای > و >> همانند شل برای نوشتن و الحاق هستند، اما (مانند awk) رونویسی فایل برای > در اولین نوشتن انجام می‌شود، نه به ازای هر رکورد. عملگر | برای ارسال از طریق لوله به فرایندی است که داده‌ها را پردازش خواهد کرد. برای هر نام فایل متمایز (برای > و >>) یک فایل باز، یا برای هر مقدار متمایز از دستور ارسال‌شده از طریق لوله (برای |) یک فرایند زیرمجموعه وجود خواهد داشت. گزینه‌های قالب‌بندی خروجی از خط فرمان اصلی گرفته می‌شوند. می‌توانید از هر یک از گزینه‌های خط فرمان قالب‌بندی خروجی، مانند --ocsv، --ofs و غیره برای کنترل قالب خروجی در صورت بازهدایت آن استفاده کنید. همچنین mlr -h را ببینید. مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums' مثال: mlr --from f.dat put --opprint '@sums[$a][$b]+=$x; emitp > "tap-".$a.$b.".dat", @sums' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > "mytap.dat", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp >> "mytap.dat", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "gzip > mytap.dat.gz", @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > stderr, @*, "index1", "index2"' مثال: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "grep somepattern", @*, "index1", "index2"' لطفاً برای اطلاعات بیشتر https://miller.readthedocs.io://johnkerl.org/miller/doc را ببینید. .fi .if n \{\ .RE .SS "end" .if n \{\ .RS 0 .\} .nf end: بلوکی از دستورها را تعریف می‌کند که پس از خوانده شدن رکوردهای ورودی اجرا می‌شوند. دستورهای بدنه باید در آکولاد محصور شوند. مثال: 'end { emit @count }' مثال: 'end { eprint "Final count is " . @count }' .fi .if n \{\ .RE .SS "eprint" .if n \{\ .RS 0 .\} .nf eprint: عبارت را بلافاصله در stderr چاپ می‌کند. مثال: mlr --from f.dat put -q 'eprint "The sum of x and y is ".($x+$y)' مثال: mlr --from f.dat put -q 'for (k, v in $*) { eprint k . " => " . v }' مثال: mlr --from f.dat put '(NR % 1000 == 0) { eprint "Checkpoint ".NR}' .fi .if n \{\ .RE .SS "eprintn" .if n \{\ .RS 0 .\} .nf eprintn: عبارت را بلافاصله و بدون خط جدید پایانی در stderr چاپ می‌کند. مثال: mlr --from f.dat put -q 'eprintn "The sum of x and y is ".($x+$y); eprint ""' .fi .if n \{\ .RE .SS "false" .if n \{\ .RS 0 .\} .nf false: مقدار لفظی بولی (boolean). .fi .if n \{\ .RE .SS "filter" .if n \{\ .RS 0 .\} .nf filter: رکورد را در جریان رکوردهای خروجی می‌گنجاند یا حذف می‌کند. مثال: mlr --from f.dat put 'filter (NR == 2 || $x > 5.4)' به جای put با 'filter false' می‌توانید به سادگی از put -q استفاده کنید. دستور زیر از رکورد ورودی برای انباشت داده‌ها استفاده می‌کند، اما تنها مجموع تجمعی را بدون چاپ رکورد ورودی چاپ می‌نماید: مثال: mlr --from f.dat put -q '@running_sum += $x * $y; emit @running_sum' .fi .if n \{\ .RE.SS "float" .if n \{\ .RS 0 .\} .nf float: یک متغیر محلی ممیز شناور را در حوزهٔ آکولاد جاری اعلان می‌کند. بررسی نوع هنگام انتساب رخ می‌دهد: 'float x = 0' یک خطا است. .fi .if n \{\ .RE .SS "for" .if n \{\ .RS 0 .\} .nf for: یک حلقهٔ for را با استفاده از یکی از سه سبک تعریف می‌کند. دستورهای بدنه باید درون آکولاد قرار گیرند. حلقهٔ for روی رکورد جریان: مثال: 'for (k, v in $*) { ... }' حلقهٔ for روی متغیرهای خارج از جریان: مثال: 'for (k, v in @counts) { ... }' مثال: 'for ((k1, k2), v in @counts) { ... }' مثال: 'for ((k1, k2, k3), v in @*) { ... }' حلقهٔ for به سبک C: مثال: 'for (var i = 0, var b = 1; i < 10; i += 1, b *= 2) { ... }' .fi .if n \{\ .RE .SS "func" .if n \{\ .RS 0 .\} .nf func: برای تعریف یک تابع تعریف‌شده توسط کاربر استفاده می‌شود. مثال: 'func f(a,b) { return sqrt(a**2+b**2)} $d = f($x, $y)' .fi .if n \{\ .RE .SS "funct" .if n \{\ .RS 0 .\} .nf funct: برای تعیین اینکه یک آرگومان تابع، تابعی تعریف‌شده توسط کاربر است به کار می‌رود. مثال: 'func g(num a, num b, funct f) :num { return f(a**2+b**2) }' .fi .if n \{\ .RE .SS "if" .if n \{\ .RS 0 .\} .nf if: یک زنجیرهٔ if/elif/elif را آغاز می‌کند. دستورهای بدنه باید درون آکولاد قرار گیرند. .fi .if n \{\ .RE .SS "in" .if n \{\ .RS 0 .\} .nf in: در حلقه‌های for روی رکوردهای جریان یا متغیرهای خارج از جریان استفاده می‌شود. .fi .if n \{\ .RE .SS "int" .if n \{\ .RS 0 .\} .nf int: یک متغیر محلی عدد صحیح را در حوزهٔ آکولاد جاری اعلان می‌کند. بررسی نوع هنگام انتساب رخ می‌دهد: 'int x = 0.0' یک خطا است. .fi .if n \{\ .RE .SS "map" .if n \{\ .RS 0 .\} .nf map: یک متغیر محلی با مقدار نگاشت (map) را در حوزهٔ آکولاد جاری اعلان می‌کند. بررسی نوع هنگام انتساب رخ می‌دهد: 'map b = 0' یک خطا است. map b = {} همیشه مجاز است. مجاز بودن map b = a بستگی به این دارد که a یک نگاشت باشد یا خیر. .fi .if n \{\ .RE .SS "num" .if n \{\ .RS 0 .\} .nf num: یک متغیر محلی int/float را در حوزهٔ آکولاد جاری اعلان می‌کند. بررسی نوع هنگام انتساب رخ می‌دهد: 'num b = true' یک خطا است. .fi .if n \{\ .RE .SS "print" .if n \{\ .RS 0 .\} .nf print: عبارت را بی‌درنگ در stdout چاپ می‌کند. مثال: mlr --from f.dat put -q 'print "The sum of x and y is ".($x+$y)' مثال: mlr --from f.dat put -q 'for (k, v in $*) { print k . " => " . v }' مثال: mlr --from f.dat put '(NR % 1000 == 0) { print > stderr, "Checkpoint ".NR}' .fi .if n \{\ .RE .SS "printn" .if n \{\ .RS 0 .\} .nf printn: عبارت را بی‌درنگ و بدون خط جدید پایانی در stdout چاپ می‌کند. مثال: mlr --from f.dat put -q 'printn "."; end { print "" }' .fi .if n \{\ .RE.SS "return" .if n \{\ .RS 0 .\} .nf return: مقدار بازگشتی یک تابع تعریف‌شده توسط کاربر را مشخص می‌کند. دستورهای return حذف‌شده (شامل اجرا نشدن در شاخه‌های if) به مقدار بازگشتی absent-null منجر می‌شوند که به نوبه خود انتساب به طرف چپ (LHS) را نادیده می‌گیرد. .fi .if n \{\ .RE .SS "stderr" .if n \{\ .RS 0 .\} .nf stderr: برای tee، emit، emitf، emitp، print و dump به جای نام فایل جهت چاپ در خطای استاندارد استفاده می‌شود. .fi .if n \{\ .RE .SS "stdout" .if n \{\ .RS 0 .\} .nf stdout: برای tee، emit، emitf، emitp، print و dump به جای نام فایل جهت چاپ در خروجی استاندارد استفاده می‌شود. .fi .if n \{\ .RE .SS "str" .if n \{\ .RS 0 .\} .nf str: یک متغیر محلی از نوع رشته (string) در حوزه آکولاد جاری اعلان می‌کند. بررسی نوع در زمان انتساب انجام می‌شود. .fi .if n \{\ .RE .SS "subr" .if n \{\ .RS 0 .\} .nf subr: برای تعریف یک زیرروال (subroutine) استفاده می‌شود. مثال: \(aqsubr s(k,v) { print k . " is " . v} call s("a", $a)\(aq .fi .if n \{\ .RE .SS "tee" .if n \{\ .RS 0 .\} .nf tee: رکورد جاری را در فایل مشخص‌شده چاپ می‌کند. این عمل چاپ فوری در فایل مشخص‌شده است (به جز برای قالب pprint که طبیعتاً تا پایان جریان ورودی منتظر می‌ماند تا کل خروجی را قالب‌بندی کند). علامت‌های > و >> همانند شل برای نوشتن و الحاق هستند، اما (مشابه awk) رونویسی فایل برای > در اولین نوشتن رخ می‌دهد، نه به ازای هر رکورد. علامت | برای هدایت از طریق لوله (pipe) به فرایندی است که داده‌ها را پردازش می‌کند. به ازای هر نام فایل مجزا (برای > و >>) یک فایل باز، یا به ازای هر مقدار متمایز از دستور لوله‌کشی‌شده (برای |) یک زیرفرایند وجود خواهد داشت. گزینه‌های قالب‌بندی خروجی از خط فرمان اصلی گرفته می‌شوند. می‌توانید از هر یک از گزینه‌های خط فرمان قالب‌بندی خروجی، مانند --ocsv ،--ofs و غیره، برای کنترل قالب خروجی استفاده کنید. همچنین mlr -h را ببینید. دستور emit با تغییر مسیر و tee با تغییر مسیر یکسان هستند، با این تفاوت که tee تنها می‌تواند $* را در خروجی قرار دهد. مثال: mlr --from f.dat put \(aqtee > "/tmp/data-".$a, $*\(aq مثال: mlr --from f.dat put \(aqtee >> "/tmp/data-".$a.$b, $*\(aq مثال: mlr --from f.dat put \(aqtee > stderr, $*\(aq مثال: mlr --from f.dat put -q \(aqtee | "tr \e[a-z\e\e] \e[A-Z\e\e]", $*\(aq مثال: mlr --from f.dat put -q \(aqtee | "tr \e[a-z\e\e] \e[A-Z\e\e] > /tmp/data-".$a, $*\(aq مثال: mlr --from f.dat put -q \(aqtee | "gzip > /tmp/data-".$a.".gz", $*\(aq مثال: mlr --from f.dat put -q --ojson \(aqtee | "gzip > /tmp/data-".$a.".gz", $*\(aq .fi .if n \{\ .RE .SS "true" .if n \{\ .RS 0 .\} .nf true: مقدار لیترال بولی. .fi .if n \{\ .RE .SS "unset" .if n \{\ .RS 0 .\} .nf unset: فیلد(ها) را از رکورد جاری، یا یک متغیر محلی یا خارج از جریان (out-of-stream) پاک می‌کند. مثال: mlr --from f.dat put \(aqunset $x\(aq مثال: mlr --from f.dat put \(aqunset $*\(aq مثال: mlr --from f.dat put \(aqfor (k, v in $*) { if (k =~ "a.*") { unset $[k] } }\(aq مثال: mlr --from f.dat put \(aq...; unset @sums\(aq مثال: mlr --from f.dat put \(aq...; unset @sums["green"]\(aq مثال: mlr --from f.dat put \(aq...; unset @*\(aq .fi .if n \{\ .RE .SS "var" .if n \{\ .RS 0 .\} .nf var: یک متغیر محلی بدون نوع را در حوزه آکولاد جاری اعلان می‌کند. مثال‌ها: \(aqvar a=1\(aq, \(aqvar xyz=""\(aq .fi .if n \{\ .RE.SS "while" .if n \{\ .RS 0 .\} .nf while: یک حلقهٔ while، یا با "do"، یک حلقهٔ do-while را آغاز می‌کند. دستورهای بدنه باید در آکولاد محصور شوند. .fi .if n \{\ .RE .SS "ENV" .if n \{\ .RS 0 .\} .nf ENV: دسترسی به متغیرهای محیطی بر اساس نام، مانند \(aq$home = ENV["HOME"]\(aq .fi .if n \{\ .RE .SS "FILENAME" .if n \{\ .RS 0 .\} .nf FILENAME: به نام فایل جاریِ در حال پردازش ارزیابی می‌شود. .fi .if n \{\ .RE .SS "FILENUM" .if n \{\ .RS 0 .\} .nf FILENUM: به شمارهٔ فایل جاریِ در حال پردازش، با شروع از ۱، ارزیابی می‌شود. .fi .if n \{\ .RE .SS "FNR" .if n \{\ .RS 0 .\} .nf FNR: به شمارهٔ رکورد جاری درون فایل جاریِ در حال پردازش، با شروع از ۱، ارزیابی می‌شود. در ابتدای هر فایل بازنشانی می‌شود. .fi .if n \{\ .RE .SS "IFS" .if n \{\ .RS 0 .\} .nf IFS: به جداکنندهٔ فیلد ورودی از خط فرمان ارزیابی می‌شود. .fi .if n \{\ .RE .SS "IPS" .if n \{\ .RS 0 .\} .nf IPS: به جداکنندهٔ جفت ورودی از خط فرمان ارزیابی می‌شود. .fi .if n \{\ .RE .SS "IRS" .if n \{\ .RS 0 .\} .nf IRS: به جداکنندهٔ رکورد ورودی از خط فرمان، یا در حالت تشخیص خودکار (که پیش‌فرض است) به LF یا CRLF از داده‌های ورودی ارزیابی می‌شود. .fi .if n \{\ .RE .SS "M_E" .if n \{\ .RS 0 .\} .nf M_E: ثابت ریاضی e. .fi .if n \{\ .RE .SS "M_PI" .if n \{\ .RS 0 .\} .nf M_PI: ثابت ریاضی pi. .fi .if n \{\ .RE .SS "NF" .if n \{\ .RS 0 .\} .nf NF: به تعداد فیلدهای موجود در رکورد جاری ارزیابی می‌شود. توجه داشته باشید که NF پویا است: در هر بار ارجاع مجدداً ارزیابی می‌شود، بنابراین اگر فیلدهایی به رکورد جاری اضافه یا از آن حذف شوند \-\- حتی درون یک عبارت put/filter منفرد \-\- مقدار NF نیز بر همین اساس تغییر می‌کند. .fi .if n \{\ .RE .SS "NR" .if n \{\ .RS 0 .\} .nf NR: به شمارهٔ رکورد جاری در تمامی فایل‌های در حال پردازش، با شروع از ۱، ارزیابی می‌شود. در ابتدای هر فایل بازنشانی نمی‌شود. .fi .if n \{\ .RE .SS "OFS" .if n \{\ .RS 0 .\} .nf OFS: به جداکنندهٔ فیلد خروجی از خط فرمان ارزیابی می‌شود. .fi .if n \{\ .RE \}.SS "OPS" .if n \{\ .RS 0 .\} .nf OPS: به جداکننده جفت خروجی از خط فرمان ارزیابی می‌شود. .fi .if n \{\ .RE .SS "ORS" .if n \{\ .RS 0 .\} .nf ORS: به جداکننده رکورد خروجی از خط فرمان، یا در صورت قرار داشتن در حالت تشخیص خودکار (که پیش‌فرض است) به LF یا CRLF برگرفته از داده‌های ورودی ارزیابی می‌شود. .fi .if n \{\ .RE .SH "نویسندگان (AUTHORS)" .sp Miller توسط John Kerl نوشته شده است. .sp این صفحه راهنما از روی خروجی راهنمای Miller توسط Eric MSP Veith گردآوری شده است. .SH "همچنین ببینید (SEE ALSO)" .sp awk(1)، sed(1)، cut(1)، join(1)، sort(1)، RFC 4180: قالب متداول و نوع MIME برای فایل‌های مقادیر جداشده با کاما (CSV)، وب‌سایت مستندات Miller در https://miller.readthedocs.io