
다음과 같은 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
따옴표로 묶인 구분 기호를 적절하게 처리하려면 Perl Text::CSV 모듈과 같은 목적에 맞게 설계된 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)