的配置與實戰(zhàn))
CLI數(shù)據(jù)分析【免費下載鏈接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON項目地址https://gitcode.com/gh_mirrors/mi/miller點擊查看免費下載Miller 把文本數(shù)據(jù)切分為記錄、字段、鍵值對三層并分別用記錄分隔符RS、字段分隔符FS與鍵值對分隔符PS來控制切分與拼接。本文以 Miller 官方參考文檔 docs/src/reference-main-separators.md 為主體完整講解--irs/--ors、--ifs/--ofs、--ips/--ops及--rs/--fs/--ps、--repifs、--ifs-regex/--ips-regex等全套分隔符命令行參數(shù)并對照倉庫源碼 pkg/cli/separators.go 與 pkg/cli/option_parse.go 講清其底層實現(xiàn)。讀完本文你將能夠在 DKVP、CSV、TSV、NIDX、XTAB 等任意格式之間自由切換分隔符實現(xiàn)數(shù)據(jù)格式的無縫轉(zhuǎn)換。記錄分隔符、字段分隔符與鍵值對分隔符Miller 從三個層次來理解分隔符記錄分隔符record separatorRS把一條條記錄分開字段分隔符field separatorFS把一條記錄里的各個字段即鍵值對分開鍵值對分隔符pair separatorPS把每個字段內(nèi)部的鍵與值分開。以經(jīng)典的 DKVP 鍵值對格式 為例數(shù)據(jù)文件 docs/src/data/a.dkvp 內(nèi)容如下cat docs/src/data/a.dkvpa1,b2,c3 a4,b5,c6在這兩行數(shù)據(jù)中記錄分隔符是換行符——它把a1,b2,c3與a4,b5,c6兩條記錄分開字段分隔符是,——它把a1、b2、c3這三個鍵值對字段分開鍵值對分隔符是——它把每個字段內(nèi)的鍵如a與值如1分開。以上是 Miller 的默認值可通過--ips、--ops等 flag 覆蓋詳見下文。需要特別說明的是并非所有文件格式都同時具備這三類分隔符。例如 CSV 就沒有鍵值對分隔符——因為 CSV 的鍵表頭獨占一行值獨占一行鍵和值并不相鄰。同樣分隔符也并非對所有文件格式都可編程。例如在 JSON 對象 中鍵值對分隔符是:、字段分隔符是,寫作{a:1,b:2,c:3}但這兩者都不可修改。即便執(zhí)行mlr --json --ips : --ips cat myfile.json你也不會得到{a1,b2,c3}——因為鍵值對分隔符:是 JSON 規(guī)范的一部分Miller 不會、也不能改變它。這一點在源碼中也有對應(yīng)在 pkg/cli/separators.go 的defaultPSes表中json、yaml、dcf、recutils等格式的 PS 一律標注為N/A不可變更、不可參數(shù)化。輸入與輸出分隔符IRS/ORS、IFS/OFS、IPS/OPSMiller 允許輸入與輸出使用相同的分隔符如 CSV 輸入、CSV 輸出也允許在輸入與輸出之間更換分隔符如 CSV 輸入、JSON 輸出從而實現(xiàn)數(shù)據(jù)的格式轉(zhuǎn)換。Miller 使用以下命名體系IRS與ORS輸入記錄分隔符與輸出記錄分隔符IFS與OFS輸入字段分隔符與輸出字段分隔符IPS與OPS輸入鍵值對分隔符與輸出鍵值對分隔符。例如把輸入為逗號/等號風(fēng)格的 DKVP 數(shù)據(jù)轉(zhuǎn)換為輸出為分號/冒號風(fēng)格的數(shù)據(jù)mlr --ifs , --ofs ; --ips --ops : cut -o -f c,a,b docs/src/data/a.dkvpc:3;a:1;b:2 c:6;a:4;b:5這里cut -o -f c,a,b把字段順序重排為c,a,b同時輸入側(cè)按,與解析輸出側(cè)按;與:寫回。再看 CSV 場景。CSV 沒有鍵值對分隔符但字段分隔符同樣可以自由切換mlr --csv head -n 2 docs/src/example.csvcolor,shape,flag,k,index,quantity,rate yellow,triangle,true,1,11,43.6498,9.8870 red,square,true,2,15,79.2778,0.0130mlr --csv --ofs pipe head -n 2 docs/src/example.csvcolor|shape|flag|k|index|quantity|rate yellow|triangle|true|1|11|43.6498|9.8870 red|square|true|2|15|79.2778|0.0130只加了一個--ofs pipe輸出字段分隔符就從逗號變成了管道符|。雙向同設(shè)的快捷 flag--rs、--fs、--ps如果數(shù)據(jù)的輸入輸出分隔符相同、不需要分別設(shè)置可以使用--rs、--fs、--ps。例如--fs :與--ifs : --ofs :完全等價但敲擊鍵盤的次數(shù)更少。以使用分號作字段分隔符、冒號作鍵值對分隔符的 DKVP 數(shù)據(jù) docs/src/data/modsep.dkvp 為例cat docs/src/data/modsep.dkvpa:1;b:2;c:3 a:4;b:5;c:6mlr --fs ; --ps : cut -o -f c,a,b docs/src/data/modsep.dkvpc:3;a:1;b:2 c:6;a:4;b:5從源碼看--rs、--fs、--ps的解析器會同時把值寫入ReaderOptions與WriterOptions例如 pkg/cli/option_parse.go 中--fs的解析器同時設(shè)置options.ReaderOptions.IFS與options.WriterOptions.OFS并分別標記ifsWasSpecified與ofsWasSpecified。這就是一個 flag 同時作用于輸入與輸出的實現(xiàn)機制。多字符分隔符除少數(shù)不允許參數(shù)化的文件格式外所有分隔符都可以是多字符的。但注意對于 CSVCSV-lite 沒有這些限制IRS必須是\n且IFS必須是單字符。例如把輸入的分號/冒號數(shù)據(jù)輸出為三連分號;;;與:風(fēng)格mlr --ifs ; --ips : --ofs ;;; --ops : cut -o -f c,a,b docs/src/data/modsep.dkvpc:3;;;a:1;;;b:2 c:6;;;a:4;;;b:5輸入側(cè)照舊按單字符;與:解析輸出側(cè)則按多字符;;;與:拼接充分體現(xiàn)了 Miller 輸入/輸出分隔符相互獨立的設(shè)計。--repifs把連續(xù)重復(fù)的分隔符視為一個如果數(shù)據(jù)中的字段分隔符是一個或多個連續(xù)空格可以使用--ifs space --repifs來解析。更一般地--repifs表示字段分隔符的多次連續(xù)出現(xiàn)只算作一次。兩種常見的處理語義對比在 CSV 數(shù)據(jù)中我們常用空字符串表示空值例如2,9,,,,,6,5,4——這里每個逗號都是有效分隔連續(xù)逗號之間是空字段必須保留但如果字段分隔符是空格把2 4 5解析成與2 4 5相同往往更自然——此時--repifs --ifs 就能實現(xiàn)這個效果。實際上--ipprint選項在內(nèi)部就是用--repifs實現(xiàn)的。從源碼看pkg/cli/separators.go 的defaultAllowRepeatIFSes表中pprint格式的默認值即為true而 CSV、DKVP、TSV 等格式默認為false——也就是說 PPRINT 格式天生就允許重復(fù)分隔符用空格對齊其余格式則需要顯式傳入--repifs才會開啟。來看官方示例數(shù)據(jù)文件 docs/src/data/extra-spaces.txtcat docs/src/data/extra-spaces.txtoh say can you see by the dawns early light what somlr --ifs --repifs --inidx --oxtab cat docs/src/data/extra-spaces.txt1 oh 2 say 3 can 4 you 1 see 2 by 3 the 4 dawns 1 early 2 light 3 what 4 so--inidx把每條記錄當作 NIDX索引編號格式讀入——字段沒有名字自動按位置編號 1、2、3、4--oxtab則輸出為 XTAB 豎向表格。行內(nèi)多個連續(xù)空格都被折疊成一個字段分隔所以oh say can you被正確切成了 4 個字段。正則表達式分隔符--ifs-regex 與 --ips-regexIFS和IPS可以是正則表達式使用--ifs-regex或--ips-regex代替--ifs或--ips即可。例如--ifs space --repifs和--ifs-regex ( )都能實現(xiàn)連續(xù)空格算一個分隔的效果。但官方文檔特別提示--ifs space --repifs比--ifs-regex ( )大約快 3 倍——正則表達式功能強大但速度更慢。因此能用手寫空格折疊解決的場景優(yōu)先用--repifs正則分隔符更適合真正需要正則能力的復(fù)雜場景例如按多種空白字符混合切分。從源碼實現(xiàn)看--ifs-regex的解析器pkg/cli/option_parse.go會調(diào)用lib.CompileMillerRegex把參數(shù)編譯為正則對象存入options.ReaderOptions.IFSRegex--ips-regex同理存入IPSRegex。這與--ifs直接存入字符串字面量的路徑不同也正是它更慢的原因所在。另外需要注意spaces、tabs、whitespace這些正則別名本身已經(jīng)是正則表達式因此不應(yīng)與--repifs搭配使用。事實上當提供了--ifs-regex時--repifs會被忽略。分隔符別名避免 shell 轉(zhuǎn)義的煩惱許多分隔符在 shell 中需要轉(zhuǎn)義例如--ifs ;、--ofs |。Miller 為此提供了命名別名可在命令行直接書寫。執(zhí)行以下命令查看完整列表mlr help list-separator-aliasesascii_esc \x1b ascii_etx \x03 ascii_fs \x1c ascii_gs \x1d ascii_null \x00 ascii_rs \x1e ascii_soh \x01 ascii_stx \x02 ascii_us \x1f asv_fs \x1f asv_rs \x1e colon : comma , cr \r crcr \r\r crlf \r\n crlfcrlf \r\n\r\n equals lf \n lflf \n\n newline \n pipe | semicolon ; slash / space tab \t usv_fs \xe2\x90\x9f usv_rs \xe2\x90\x9e這些別名中crlf、crlfcrlf、lflf等對換行風(fēng)格特別有用——例如--ors crlf可以輸出 RFC-4180 風(fēng)格的 CRLF 行尾。asv_fs/asv_rs對應(yīng) ASCII 單位分隔符/記錄分隔符與usv_fs/usv_rs對應(yīng) Unicode U241F/U241E則是 ASV/USV 這類專門用于分隔字段/記錄的控制字符格式見 CSV/TSV/ASV/USV 等格式說明。而--ifs-regex與--ips-regex則另有正則別名表mlr help list-separator-regex-aliasesspaces ( ) tabs (\t) whitespace ([ \t])從源碼 pkg/cli/separators.go 看這些別名都定義在SEPARATOR_NAMES_TO_VALUES與SEPARATOR_REGEX_NAMES_TO_VALUES兩張映射表中pkg/cli/mlrcli_util.go 中的SeparatorFromArg與SeparatorRegexFromArg函數(shù)負責把別名解析為真實的分隔符字符串——如果命中別名表就返回對應(yīng)值否則原樣返回參數(shù)本身。這也是 shell 補全pkg/cli/flag_types.go 中的FlagValueCandidates能夠為--ifs等 flag 枚舉候選值的基礎(chǔ)。命令行 flag 匯總綜合以上內(nèi)容Miller 的分隔符相關(guān) flag 全景如下--rs --irs --ors --fs --ifs --ofs --repifs --ifs-regex --ps --ips --ops --ips-regex其中--rs {string}/--irs {string}/--ors {string}記錄分隔符輸入和輸出 / 僅輸入 / 僅輸出--fs {string}/--ifs {string}/--ofs {string}字段分隔符輸入和輸出 / 僅輸入 / 僅輸出--ps {string}/--ips {string}/--ops {string}鍵值對分隔符輸入和輸出 / 僅輸入 / 僅輸出--repifs允許輸入字段分隔符連續(xù)重復(fù)出現(xiàn)并只算一次--ifs-regex {string}/--ips-regex {string}以正則表達式形式指定輸入字段分隔符 / 輸入鍵值對分隔符。完整的 flag 說明可參見 reference-main-flag-list.md 的分隔符 flag 一節(jié)或在終端運行mlr help separator-flags查看。DSL 內(nèi)置變量IRS、ORS、IFS、OFS、IPS、OPSMiller 在 DSL 中向用戶暴露了只讀的 內(nèi)置變量IRS、ORS、IFS、OFS、IPS、OPS。與 AWK 不同你不能在 begin 塊中給這些變量賦值——它們的值只反映你在命令行指定的內(nèi)容因此用途有限主要用于調(diào)試或在put/filter中讀取當前生效的分隔符。例如下面的命令在每條記錄上追加一個字段d其值由輸入字段分隔符,與輸出字段分隔符;拼接而成mlr --ifs , --ofs ; --ips --ops : --from docs/src/data/a.dkvp put $d . IFS . ||| . OFS . a:1;b:2;c:3;d:,|||; a:4;b:5;c:6;d:,|||;可以看到d字段中嵌入了IFS,與OFS;的真實值直觀驗證了內(nèi)置變量的含義。哪些分隔符適用于哪些文件格式不同文件格式對 RS/FS/PS 的支持程度差異很大。官方文檔給出了完整的對照表RSFSPSCSV默認\n可設(shè)為\r\n*默認,必須是單字符無TSV默認\n可設(shè)為\r\n*默認\t必須是單字符無CSV-lite默認\n*默認,無TSV-lite默認\n*默認\t無JSON不適用記錄位于{與}之間恒為,不可修改恒為:不可修改YAML不適用文檔由---或單個數(shù)組分隔不適用不可修改恒為:不可修改DCF不適用段落由空行分隔不適用不可修改恒為:不可修改recutils不適用記錄由空行分隔不適用不可修改恒為:不可修改DKVP默認\n默認,默認DKVPX默認\n默認,輸入必須是單字符默認輸入必須是單字符NIDX默認\n默認空格無XTAB不使用記錄之間用額外的 FS 分隔\n*默認空格并允許重復(fù)PPRINT默認\n*空格并允許重復(fù)無Markdown恒為\n不可修改 *一個或多個空格加|再加一個或多個空格不可修改無* 在 Windows 上為\r\n。配套的注意事項如下CSVIRS必須是換行符輸入時接受 CR/LF 行尾ORS必須是換行符默認或回車換行——例如--ors crlf或--ors \r\n用于在任何平臺上輸出 RFC-4180 風(fēng)格行尾IFS必須是單字符。CSV-lite 沒有這些限制。TSVIRS必須是換行符輸入時接受 CR/LF 行尾ORS必須是換行符默認或回車換行IFS必須是制表符。TSV-lite 沒有這些限制。JSON 與 YAML忽略命令行傳入的分隔符 flag。無表頭 CSV與使用逗號作為IFS的 NIDX 格式有相當程度的重疊詳見 CSV 帶表頭與不帶表頭。XTAB的記錄分隔符是字段分隔符的重復(fù)例如一條記錄是x1,y2、下一條是x3,y4且OFS為換行符時輸出行依次為x 1、y 2、一個額外換行、x 3、y 4。這意味著要定制 XTAB應(yīng)設(shè)置OFS而非ORS。這張表的底層依據(jù)同樣可以在 pkg/cli/separators.go 中找到defaultFSes、defaultPSes、defaultRSes三張表按格式csv、tsv、csvlite、tsvlite、json、yaml、dkvp、dkvpx、nidx、xtab、pprint、markdown等記錄了每種格式的默認分隔符凡標記為N/A的即表示該格式不可參數(shù)化。例如defaultFSes[json] N/A、defaultRSes[xtab] \n\nXTAB 用兩個換行——即空行——分隔記錄與文檔表格完全吻合。小結(jié)與實戰(zhàn)建議Miller 的分隔符體系可以概括為三句話三層分隔記錄分隔符RS切記錄、字段分隔符FS切字段、鍵值對分隔符PS切鍵值三者分別有輸入I與輸出O兩個版本共六個獨立可配置項。按需取舍DKVP、XTAB 等格式三類分隔符齊全且全部可編程CSV/TSV 無鍵值對分隔符但字段分隔符可編程JSON/YAML/DCF/recutils 等格式的分隔符由規(guī)范決定不可修改。用對工具普通場景直接用--ifs/--ofs/--ips/--ops或快捷的--fs/--ps連續(xù)空格數(shù)據(jù)用--ifs space --repifs比正則快約 3 倍真正需要正則切分時用--ifs-regex/--ips-regex需要跨平臺穩(wěn)定行尾時用--ors crlf等別名。掌握這些參數(shù)你就可以在 CSV、TSV、DKVP、NIDX、XTAB、JSON 等格式之間自由轉(zhuǎn)換數(shù)據(jù)也可以在同一格式內(nèi)部按需定制分隔符——這正是 Miller 作為面向命名索引數(shù)據(jù)的 awk/sed/cut/join/sort的核心能力之一。贊分享CLI數(shù)據(jù)分析【免費下載鏈接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON項目地址https://gitcode.com/gh_mirrors/mi/miller點擊查看免費下載相關(guān)推薦antd Space 分隔符separator完全指南相鄰組件間隔符的配置方式與渲染原理antd Space 分隔符separator完全指南相鄰組件間隔符的配置方式與渲染原理 Ant Design 的 Space https://link.前端UI組件設(shè)計系統(tǒng)StarRocks split 函數(shù)完全指南字符串按分隔符切分與 ARRAY 化處理StarRocks split 函數(shù)完全指南字符串按分隔符切分與 ARRAY 化處理 split 是 StarRocks 提供的字符串處理函數(shù)用于將一段字符數(shù)據(jù)庫OLAP數(shù)據(jù)倉庫大數(shù)據(jù)湖倉一體數(shù)據(jù)分析SeaTunnel Split Transform 詳解按分隔符拆分字段的配置、行為與源碼原理SeaTunnel Split Transform 詳解按分隔符拆分字段的配置、行為與源碼原理 Split Transform 是 SeaTunnel se數(shù)據(jù)集成ETL大數(shù)據(jù)批處理流處理變更數(shù)據(jù)捕獲上一篇如何用Mousecape打造專屬桌面體驗5步個性化指南下一篇Zeus IoT解鎖百萬級設(shè)備并發(fā)的工業(yè)級物聯(lián)網(wǎng)平臺創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考