awk - 헤더가 없는 파일을 헤더, 레코드1, 레코드2 형식의 CSV로 처리합니다.

awk - 헤더가 없는 파일을 헤더, 레코드1, 레코드2 형식의 CSV로 처리합니다.

다음 형식의 데이터 파일이 있습니다

abcd:
 x:123
 y:2345
pqrs:
 x:456
 y:720
mnop:
 x:234
 y:4567
:
:

awk 형식의 CSV로 어떻게 변환합니까?

abcd,123,2345,<userstring1>,<userstring2>
pqrs,456,720,<userstring1>,<userstring2>
mnop,234,4567<userstring1>,<userstring2>

답변1

가설입력은 실제로 올바른 형식의 YAML입니다( x및 키 y뒤에 공백이 추가됨 ).

abcd:
 x: 123
 y: 2345
pqrs:
 x: 456
 y: 720
mnop:
 x: 234
 y: 4567

(예제가 실제 데이터를 나타낸다고 가정하면 :각 줄의 첫 번째 줄 뒤에 공백을 추가하기만 하면 데이터를 이 형식으로 변환 할 수 있습니다 sed 's/:/: /'.)

이를 CSV 형식의 데이터세트로 변환하고 다음과 같이 끝에 정적 문자열이 포함된 필드를 추가할 수 있습니다.

yq -r 'to_entries|map([.key, .value.x, .value.y, $ARGS.positional[] ] | @csv)[]' file --args "userstring1" "userstring2"

이것은 Andrey Kislyuk yq의 것을 사용합니다https://kislyuk.github.io/yq/원본 문서에 있는 각 항목의 최상위 키와 합계 x값에 대한 인용된 CSV 레코드를 생성합니다 y. 각 레코드에는 명령줄 끝에 별도의 필드로 추가된 문자열도 있습니다.

생성된 출력은 헤더 없는 CSV 파일입니다.

"abcd",123,2345,"userstring1","userstring2"
"pqrs",456,720,"userstring1","userstring2"
"mnop",234,4567,"userstring1","userstring2"

Mike Farah의 구현( Andrey와 같은 yq다기능 프로세서를 둘러싼 래퍼가 아님)을 사용하려는 경우 다음을 사용할 수 있습니다.jqyq

yq 'to_entries|map([.key, .value.x, .value.y, "userstring1", "userstring2"]) | @csv' file

yqMike's를 사용할 때 이와 같은 표현식에 추가 사용자 문자열을 삽입하지 않고 추가 사용자 문자열을 추가하는 것을 피하는 방법을 잘 모르겠습니다 yq.

답변2

awk를 사용하십시오.

awk -F':' -v OFS=',' -v strs='<userstring1>,<userstring2>' '
    /^[^ ]/ { if (NR>1) print rec, strs; rec=$1; next }
    { rec = rec OFS $2 }
    END { print rec, strs }
' file
abcd,123,2345,<userstring1>,<userstring2>
pqrs,456,720,<userstring1>,<userstring2>
mnop,234,4567,<userstring1>,<userstring2>

관련 정보