标签: miller

如何从 Miller (mlr) 的 DSL 中调用外部命令?

假设我有以下 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\'将增加id1。

\n\n

但是,如果我可以 \xe2\x80\x99t 在 Miller\xe2\x80\x99s DSL 中定义该函数(也许是因为它不是纯函数)怎么办?假设我想将 CSV 中的每个域映射到一个 IP 地址。我\xe2\x80\x99d 喜欢做类似的事情mlr --csv put \'$ip = shell("nslookup $domain")。是否有捷径可寻?

\n\n

目前,我正在将输入字段提取到一个单独的文件中,在单独的 shell 脚本中重写它,然后将结果添加回mlr join. 然而,这相当混乱,因为我的 CSV 充满了引号逗号和换行符,我需要自己小心处理,而不是依赖 Miller。

\n

shell csv miller

6
推荐指数
1
解决办法
765
查看次数

使用 CSV 解析器根据特定列对 CSV 行进行重复数据删除

我搜索了这个任务,发现了以下较旧的问题:

但我无法使用,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)

但这是一个错误。

linux csv miller csvkit

6
推荐指数
2
解决办法
388
查看次数

在米勒的数据字段中输出标题标签

给定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只能使用。

text-processing miller

5
推荐指数
1
解决办法
233
查看次数

如何使用 miller 创建新列并向其添加随机标识符

我想在我的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)

到底要在上面的命令中添加什么?

linux shell text-processing csv miller

3
推荐指数
1
解决办法
395
查看次数

强制 miller 将数据作为字符串读取并转换为 JSON

在接下来的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”周围引号的基本原理正是为了强调这一意图。)

json miller

0
推荐指数
1
解决办法
101
查看次数

使用 miller 将小写字母转换为大写字母并将输出输出到新列

我想将列复制NAME到列NAME-LOWERCASENAME-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)

如何组合这两个命令?或者还有另一个米勒命令来实现我的目标?

text-processing csv miller

0
推荐指数
1
解决办法
264
查看次数

标签 统计

miller ×6

csv ×4

text-processing ×3

linux ×2

shell ×2

csvkit ×1

json ×1