Millerのレコードで「Last、First」を(痛みなしに)分割または反転するにはどうすればよいですか?

Millerのレコードで「Last、First」を(痛みなしに)分割または反転するにはどうすればよいですか?

「姓、名前」の形式の列を持つタブ区切りファイルがあります。私がしたいのは、レコードを2つの別々の列、、および、last使用、firstまたはcut他の動詞に分割することです。それ、結果をJSONに出力します。

私はJSONと結婚しておらず、次のような他のツールの使い方を知っていることを付け加える必要があります。jqしかし、この形式を一度に取得するのが良いでしょう。

この動詞の構文は、nest率直に思い出せない覚えておくべきオプションがたくさんあるように見えるので、これを行う簡単なDSL作業が必要だと思いました。たぶんそうではないかもしれませんか?

私が試したことは次のとおりです。 (今は余分なスペースがついているということを忘れてしまおう、わかりましたか?後で取り除くためにorまたは何かをFirstname使います。)stripssub

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, FirstNameFirstName LastNameDSL式の使用に切り替える方法は次のとおりです。

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動詞とすべての必須フラグを使用するよりもはるかに簡単です。

関連情報