假设我有以下 CSV:
\n\n$ cat test.csv\nid,domain\n1,foo.com\n2,bar.com\n
Run Code Online (Sandbox Code Playgroud)\n\n使用mlr put
,我可以轻松地将任何函数映射到 CSV 中的字段,只要我可以在 Miller DSL中定义它。因此,例如,mlr --csv put \'$id = $id + 1\'
将增加id
1。
但是,如果我可以 \xe2\x80\x99t 在 Miller\xe2\x80\x99s DSL 中定义该函数(也许是因为它不是纯函数)怎么办?假设我想将 CSV 中的每个域映射到一个 IP 地址。我\xe2\x80\x99d 喜欢做类似的事情mlr --csv put \'$ip = shell("nslookup $domain")
。是否有捷径可寻?
目前,我正在将输入字段提取到一个单独的文件中,在单独的 shell 脚本中重写它,然后将结果添加回mlr join
. 然而,这相当混乱,因为我的 CSV 充满了引号逗号和换行符,我需要自己小心处理,而不是依赖 Miller。
我搜索了这个任务,发现了以下较旧的问题:
但我无法使用,awk
因为我的数据是一个复杂的 CSV 文件,带有多个嵌套双引号。
假设我想对以下内容进行重复数据删除(简化情况):
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
在输出中我需要它如下:
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
没有awk
解决方案,只能使用任何 CSV 解析器。
我尝试了以下方法:
mlr --csv uniq -a -g Ref file.csv
Run Code Online (Sandbox Code Playgroud)
但这是一个错误。
给定file.csv:
a,b,c
1,2,3
Run Code Online (Sandbox Code Playgroud)
如何mlr
输出:
a,b,c
1,2,c
Run Code Online (Sandbox Code Playgroud)
使用预先$c
不知道$c
包含字母“ c ”的标签名称?
注意:正确答案mlr
只能使用。
我想在我的csv
文件中添加一列,其中包含随机创建的“案例编号”。案例编号的前 2 个字母必须是 AZ 中的任意大写字母。接下来是 5 个随机数。
输入:
COMPANY,NAME,STREET,ZIP,CITY,IBAN
Test Ltd,John,Big Ben 343,4343,London,UK2348020384
Test Ltd,Kate,Big Ben 343,4343,London,UK4389223892
Test Ltd,Jake,Big Ben 343,4343,London,UK3892898999
Run Code Online (Sandbox Code Playgroud)
输出
COMPANY,NAME,STREET,ZIP,CITY,IBAN,CASENUMBER
Test Ltd,John,Big Ben 343,4343,London,UK2348020384,IN84903
Test Ltd,Kate,Big Ben 343,4343,London,UK4389223892,TY93842
Test Ltd,Jake,Big Ben 343,4343,London,UK3892898999,OL34307
Run Code Online (Sandbox Code Playgroud)
如何与米勒一起做到这一点?我准备好了以下命令
mlr -I --csv put '${CASENUMBER}=xxx' then \
reorder -f COMPANY,NAME,STREET,ZIP,CITY,IBAN,CASENUMBER input/input.csv
Run Code Online (Sandbox Code Playgroud)
到底要在上面的命令中添加什么?
在接下来的MWE中
echo x="1e2" | mlr --ojson cat
Run Code Online (Sandbox Code Playgroud)
我的目的是让 miller 生成一个包含该对象的单元素 JSON 数组
{"x": "1e2"}
Run Code Online (Sandbox Code Playgroud)
实际返回的对象(在数组内)是
{"x": 1e2}
Run Code Online (Sandbox Code Playgroud)
其中值被视为数字,我猜这是其解析的结果。我如何告诉 miller 生成 JSON 对象,其值是字符串而不是数字?(MWE 中“1e2”周围引号的基本原理正是为了强调这一意图。)
我想将列复制NAME
到列NAME-LOWERCASE
。NAME-LOWERCASE
应该只包含小写字母。除此以外,所有列中的大写字母均应保持不变NAME-LOWERCASE
输入
NAME,test
PTC,N
Agri,Y
E-example,N
ForYou,N
Willy Nes,Y
Run Code Online (Sandbox Code Playgroud)
输出
NAME,NAME-LOWERCASE,test
PTC,ptc,N
Agri,agri,Y
E-example,E-example,N
ForYou,foryou,N
Willy Nes,willy nes,Y
Run Code Online (Sandbox Code Playgroud)
我知道如何从另一列创建新列并重新排序
mlr -I --csv \
put '$FIRSTNAME = sub($FULLNAME," .*","")' then \
reorder -f FULLNAME,LASTNAME,EMAIL,DOMAIN,COMPANY input.csv
Run Code Online (Sandbox Code Playgroud)
我知道如何将大写转换为小写
mlr --csv -N case -l
Run Code Online (Sandbox Code Playgroud)
如何组合这两个命令?或者还有另一个米勒命令来实现我的目标?