我有一个制表符分隔的文件,其中一列的格式为“姓氏,名字”。我想要做的是将记录分成两个单独的列,last
、 和first
、 usecut
或其他一些动词那,并将结果输出为JSON。
我应该补充一点,我并没有与 JSON 结婚,而且我知道如何使用其他工具,例如jq
,但如果能一步获得这种格式就太好了。
该动词的语法nest
看起来需要记住很多坦率地说难以记忆的选项,所以我认为应该有一个简单的 DSL 操作来完成这项工作。也许事实并非如此?
这是我尝试过的。 (让我们忘记Firstname
现在附加的额外空间,好吗?稍后我会使用strip
orssub
或其他东西来摆脱它。)
echo -e "last_first\nLastName, Firstname" \
| mlr --t2j put '$o=splitnv($last_first,",")'
# result:
# { "last_first": "LastName, Firstname", "o": "(error)" }
# expected something like:
# { "last_first": "LastName, Firstname", "o": { 1: "LastName", 2: "Firstname" } }
#
# or:
# { "last_first": "LastName, Firstname", "o": [ "LastName", "Firstname" ] }
为什么(error)
?$o
如上所述分配给 会o
为 的结果分配一个新列,这不是合理的吗splitnv
?
这是我尝试过的其他方法,但也没有像我预期的那样工作:
echo -e "last_first\nLastName, Firstname" \
| mlr -T nest --explode --values --across-fields --nested-fs , -f last_first
# result (no delimiter here, just one field, confirmed w/ 'cat -A')
# last_first
# LastName, Firstname
# expected:
# last_first_1<tab>last_first_2
# LastName,<tab> Firstname
编辑:上面命令的问题是我应该使用--tsv
,不是 -T
--nidx --fs tab
,它是(数字索引列)的同义词。问题是,当在这种情况下请求命名列明显错误时,Miller 不会生成错误消息,这可能是一个错误功能;看问题#233。
任何见解将不胜感激。
答案1
我不知道我是否理解你的要求。
如果我跑
echo -e "last_first\nLastName, Firstname" | \
mlr --t2j --jlistwrap --jvstack nest --explode --values --across-fields --nested-fs "," -f last_first \
then clean-whitespace
我有
[
{
"last_first_1": "LastName",
"last_first_2": "Firstname"
}
]
如果我跑
echo -e "last_first\nLastName, Firstname" | \
mlr --tsv nest --explode --values --across-fields --nested-fs "," -f last_first \
then clean-whitespace
我有
last_first_1 last_first_2
LastName Firstname
答案2
LastName, FirstName
以下是切换到FirstName LastName
使用 DSL 表达式的方法:
echo -e "last_first\nLastName, Firstname\nAnotherLast, AnotherFirst" \
| mlr --t2j \
put -q 'o=splitnv($last_first,",");
first_last=strip(o[2]) . " " . o[1];
emit first_last'
# result:
# { "first_last": "Firstname LastName" }
# { "first_last": "AnotherFirst AnotherLast" }
我认为似乎是必需的(?)这一事实emit
是我之前不理解的关键部分。
可悲的是,不是nest
比使用动词及其所有必需的标志容易得多。