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