Unix는 CSV 파일의 열을 자릅니다.

Unix는 CSV 파일의 열을 자릅니다.

Unix 명령줄에서 "test10" 열을 5자로 자르려면 어떻게 해야 합니까?

따라서

test1,test2,test3,test4,test10,test11,test12,test17
rh,mbn,ccc,khj,ee3 eeeeeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a2,3,u
hyt,bb,mb,khj,R ee3ee eeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a,5,r
mbn,htr,ccc,fdf,F1ee eeeeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a,e,r

이와 관련하여

test1,test2,test3,test4,test10,test11,test12,test17
rh,mbn,ccc,khj,ee3 e,a2,3,u
hyt,bb,mb,khj,R ee3,a,5,r
mbn,htr,ccc,fdf,F1ee ,a,e,r

답변1

파일이 예제만큼 간단하다면 다음 중 하나를 수행할 수 있습니다.

  • awk

    $ awk -F, -vOFS=, 'NR>1{$5=substr($5,1,5)}1' file 
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    설명하다

    -F,입력 필드 구분 기호를 로 설정 ,하고 -vOFS=,변수 OFS(출력 필드 구분 기호)를 로 설정합니다 ,. NR은 현재 줄 번호이므로 위 스크립트는 5번째 필드를 5자 하위 문자열로 변경합니다. 유일한 것은 1"이 줄을 인쇄하세요"에 대한 awk의 약어입니다.

  • perl

    $ perl -F, -lane '$F[4]=~s/(.{5}).*/$1/ if $.>1; print join ",", @F' file 
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    설명하다

    Perl을 awk처럼 동작하게 만들고 -a주어진 문자를 기반으로 입력 줄을 분할하여 -F배열의 요소로 저장합니다 @F. 그런 다음 5번째 필드에서 처음 5자를 제외한 모든 문자를 제거하고(처음부터 계산됨 ) 쉼표로 연결된 결과 배열을 0인쇄합니다 .@F

  • sed

    $ sed  -E '1!s/(([^,]+,){4}[^,]{5,5})[^,]*,/\1,/' file
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    설명하다

    이는 대체 연산자이며 일반적인 형식은 입니다 s/original.replacement/. 이는 1!"첫 번째 줄에서는 이 작업을 수행하지 마십시오"를 의미합니다 . 정규식은 문자가 아닌 문자 집합과 일치 ,하며 ,4번( ([^,]+,){4}), ,문자가 아닌 5개( [^,]{5})(5번째 필드의 처음 5개), 필드 끝까지의 기타 문자( [^,]+,)를 일치시킵니다. 이들 모두는 줄의 첫 번째 부분으로 대체되어 필드를 효과적으로 자릅니다.

답변2

사용 awk:

awk -F , 'BEGIN { OFS = FS } NR > 1 { $5 = substr($5,1,5) }; 1' data.csv

-F플래그는 입력 필드 구분 기호를 설정하고, 이 BEGIN블록은 출력 필드 구분 기호를 입력 필드 구분 기호(쉼표)로 설정합니다.

현재 레코드의 시퀀스 번호( NR)가 1보다 큰 경우(즉, 헤더 행을 전달한 경우) substr()함수는 다섯 번째 필드(열)를 최대 5자로 자릅니다. 이렇게 하면 입력 데이터의 첫 번째 행이 수정되는 것을 방지할 수 있습니다.

단독으로 (아마도) 수정된 레코드(행)가 표준 출력으로 인쇄됩니다 1.awk

관련 정보