배열 열을 잘라내고 다른 열을 csv 파일에 결합

배열 열을 잘라내고 다른 열을 csv 파일에 결합

CSV 파일이 있습니다

input.csv

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

위의 CSV 파일에서 배열 열을 제거하고 출력을 얻어야 합니다.

output.csv

1,2,3,9,12
1,2,3,9,12
1,2,3,9,12

그래서 나는 노력했다

cut -d , -f4 -- complement input.csv > output.csv

그러나 위의 명령은 오류를 제공합니다

구분 기호는 단일 문자여야 합니다.

또한 output.csv를 다른 CSV 파일과 결합하고 싶습니다.

column.csv
30
36
90

그러면 결과는 이렇습니다

result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

누구든지 나를 도와줄 수 있나요?

답변1


밀러(http://johnkerl.org/miller/doc)부터 시작

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

매우 간단합니다. 실행할 수 있습니다.

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv

얻다

1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

cut -x -f 4네 번째 열을 제거하고 column.csv paste열을 추가했습니다.

답변2

따옴표로 묶인 구분 기호를 올바르게 처리하려면 특별히 설계된 CSV 파서(예: perl Text::CSV 모듈의 파서) 사용을 고려해야 합니다. 예를 들어,

paste -d, input.csv column.csv | perl -MText::CSV -ne '
  BEGIN {$csv = Text::CSV->new()}
  if ($csv->parse($_)) {
    @a = $csv->fields();
    splice(@a, 3, 1);
    print join(",", @a) . "\n";
  }'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

답변3

@steeldrive가 제안한 특별히 설계된 CSV 파서를 사용하지 않으려면 다음을 사용할 수 있습니다 awk.

awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv

이는 예제에 제공된 스타일에서만 작동합니다.

설명하다:

텍스트 공간 분할"

{split($0,a,"\"")

,두 번째 열의 첫 번째 열을 인쇄하고 삭제합니다.

print a[1] substr(a[3],2)

관련 정보