Miller의 레코드에서 "Last, First"를 (고통 없이) 분할하거나 반전하려면 어떻게 해야 합니까?

Miller의 레코드에서 "Last, First"를 (고통 없이) 분할하거나 반전하려면 어떻게 해야 합니까?

"성, 이름" 형식의 한 열이 있는 탭으로 구분된 파일이 있습니다. 내가하고 싶은 것은 레코드를 두 개의 별도 열, 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동사와 모든 필수 플래그를 사용하는 것보다 훨씬 쉽습니다.

관련 정보