sed: csv 파일 열의 소수 자릿수 자르기

sed: csv 파일 열의 소수 자릿수 자르기

sed를 사용하여 csv 파일 번호의 소수 부분 전체를 제거하려고 합니다. 내가 할 수 있는 일은 파일의 전체 열에서 모든 소수점(예: .0)을 자르는 것뿐입니다. 하지만 여섯 번째 열에서만 이 작업을 수행하는 방법을 모르겠습니다.

입력하다:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28.0,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25.0,0,0,348123,7.65,F G73,S

예상 출력:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

내 시도:

sed -r ‘s/\.0//g’ file.csv

답변1

조금 어색하지만 작업이 완료되었다고 생각합니다.

파이썬 csvkit패키지CSV 파일 처리를 위한 명령줄 도구가 포함되어 있습니다. 무엇보다도 csvcut이는 표준 cut명령처럼 작동하지만 CSV를 지원합니다. 즉, 필드가 올바르게 인용되는 한 필드 구분 기호와 줄 바꿈을 포함할 수 있습니다.

를 사용하면 csvcut수정하려는 열을 잘라내어 수정한 다음 다시 제자리에 놓을 수 있습니다. paste필드를 다시 정리하기 위해 쉼표를 구분 기호로 사용했습니다 . 이 paste유틸리티는 처음 몇 개의 필드(수정되지 않음), 수정하려는 필드( sed간단한 스크립트를 사용하여 수정됨) 및 마지막 몇 개의 필드(수정되지 않음)에 해당하는 세 가지 입력 스트림을 사용합니다.

paste -d, \
    <( csvcut -c -5  file.csv ) \
    <( csvcut -c  6  file.csv | sed '1!s/\..*//' ) \
    <( csvcut -c  7- file.csv )

sed표현식은 1!s/\..*//첫 번째 줄을 제외한 모든 줄에서 한 점과 그 뒤의 모든 내용을 삭제합니다.

이는 전체 입력 파일을 세 번 읽으므로 약간 덜 효율적입니다.

결과:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

답변2

sed쉼표를 구분 기호로 사용하고 이름 필드의 쉼표를 구분 기호로 사용하지 않으면 너무 복잡해지기 때문에 이 작업을 수행할 수 없어서 awk다음 gsub옵션을 사용했습니다.

awk -F ',' 'NR==1; NR>1{gsub("\.0","",$7);print} ' OFS="," file

상황을 고려하면 약간 혼란스럽기는 하지만 쉼표를 구분 기호로 설정하고 첫 번째 줄을 인쇄한 다음 첫 번째 줄 뒤의 모든 줄에서 .0이름과 같이 일곱 번째 필드에 있는 항목으로 바꿉니다. The comma 실제로 age를 일곱 번째 필드로 만든 다음 출력 필드 구분 기호를 다시 쉼표로 설정하고 다음을 인쇄합니다.

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

답변3

CSV 파일로 작업할 때 직면하는 주요 문제는 열 유형이 문자열이고 문자열이 (큰따옴표)로 묶인 경우 열 구분 기호가 열 값 자체에 있을 수 있다는 것입니다.

따라서 다음 명령은 다음과 같습니다.

sed -r 's/^(([^,]*,){6})([^\.,]*)[^,]*(,.*)$/\1\3\4/g'

예, 하지만 텍스트 문자열에 쉼표가 없는 경우에만 해당됩니다. 이 상황을 처리하려면 이전 포스터에서 제안한 것과 같은 도구가 필요합니다.

답변4

간단한age 필드를 끝에서부터 살펴보는 접근 방식이 있을 수 있습니다. 왜냐하면 해당 끝에서부터 시작하면 필드 내부에 구분 기호가 없기 때문입니다.

awk -F, -v OFS=, '
  NR>1{$(NF-6) = int($(NF-6))}1
' file

사용sed확장 정규식을 사용하여 -r끝부터 시작하여 필드 수를 계산합니다.

sed -r '
  s/\.0((,[^,]*){6})$/\1/
' file

산출:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
343,No,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13.0,,S
76,No,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S

관련 정보