열을 삭제해야 하는 CSV 파일이 있습니다. 문제는 헤더 없이 CSV 파일을 내보낸다는 것입니다. 그렇다면 CSV 파일에서 이 열을 어떻게 제거할 수 있습니까? 예를 들어, 내가 가지고 있는 경우예제.csv부울 데이터인 마지막 열을 제거하고 파일을 다음과 같이 가져오고 싶습니다.입력.csv.
입력.csv
1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE
출력.csv
1,"data",100.00
2,"code",91.8
3,"analytics",100.00
답변1
네 번째 열을 삭제하려면
$ cut -d, -f4 --complement example.csv > input.csv
열 번호와 일치하도록 -f 옵션을 조정합니다.
CSV 파일이 더 복잡하다면 Perl 및 Text::CSV 패키지를 사용할 수 있습니다.
$ perl -MText::CSV -E '$csv = Text::CSV->new({binary=>1}); while ($row = $csv->getline(STDIN)) { "$row->[0],$row->[1],$row->[2]\n"을 인쇄합니다. }' <example.csv> 입력.csv
답변2
나는 사용하는 것이 좋습니다밀러(일명 mlr
). Miller는 다양한 형식(예: TSV, CSV, 테이블 형식 JSON, 키-값 쌍)의 표 형식 데이터를 스트리밍하기 위해 C(종속성 없음)로 작성된 작은(1MB 미만) 프로그램입니다. 이는 대부분의 Linux 배포판 저장소(일반적으로밀러). CSV 파서는 여러 줄의 셀(즉, 줄 바꿈이 포함된 셀)을 처리합니다. 헤더가 있는 CSV 파일을 가정하지만 제목 없는 CSV 파일을 처리할 수 있는 옵션(및)이 있습니다 --implicit-csv-header
. --headerless-csv-output
사용 사례에서 네 번째 열(열 인덱스는 1로 시작)을 삭제한다고 가정하면 다음과 같이 할 수 있습니다.
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv > output.csv
계산하지 않고 마지막 열을 제거하려면 다음 rev
과 같이 데이터를 처리하기 전에 각 CSV 행을 반대로 한 다음 다시 제거하면 됩니다.
< input.csv rev |
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 1 |
rev > output.csv
도움이 되길 바랍니다.
답변3
Python에서 csv 모듈 사용:
python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
w.writerow(row[0:-1])' < input.csv > output.csv
출력에 열 2, 3, 1이 순서대로 포함되도록 하려면 다음을 사용하십시오.
python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
w.writerow([row[1], row[2], row[0]])' < input.csv > output.csv
Python 배열 인덱싱은 0에서 시작하므로 위에 표시된 것처럼 열 번호도 0부터 계산되기 시작합니다. 이것이 바로 열 2, 3, 1이 각각 1, 2, 0인 이유입니다.
답변4
CSV 형식은 때때로 까다롭습니다. CSV 파서가 최선의 선택입니다.
쉬운 방법을 택하고 마지막 필드를 삭제하세요.
1) awk로 마지막 필드를 삭제합니다.
awk 'BEGIN{FS=OFS=","}{NF--;print}'
2) 정규식과 펄
perl -pe 's/.*\K,.*//'