csv 파일에서 31열의 첫 번째 값을 삭제하려고 합니다. 열은 아래와 같이 따옴표로 묶이고 쉼표로 구분됩니다.
"first_name","last_name","home_address"
"Frank",Russel","123 Hampton road"
31열은 이미지 열이며, 이미지는 쉼표로 구분됩니다.
"http://ddd.com/124dfr3f.jpg,http://ddd.com/hjasgx37trg.jpg"
첫 번째 이미지와 뒤따르는 쉼표는 31열에서 제거되어야 합니다.
다음에 추가- 여기에 예가 있습니다.
"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","three","four","five","six","seven","eight","nine","ten","twenty-one","twenty-two","three","four","five","six","seven","eight","nine","ten","thirty-one","thirty-two","three","four","five","six","seven","eight","nine","forty"
"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","three","four","five","six","seven","eight","nine","ten","twenty-one","twenty-two","three","four","five","six","seven","eight","nine","http://pictures.domain.com/e/josequervo/1183/eeeffcc7927sssssssssss5d26c0eb19e1dc53548x.jpg","http://pictures.domain.com/e/josequervo/0083/eeef8cc7927bf1245d26c0eb19e1dc53545x.jpg,http://pictures.domain.com/e/josequervo/0099/eeefscc7927bf1245d26c0eb19e1dc53546x.jpg,http://pictures.domain.com/e/josequervo/0012/eeefdcc7927bf1245d26c0eb19e1dc53547x.jpg,http://pictures.domain.com/e/josequervo/1183/eeeffcc7927bf1245d26c0eb19e1dc53548x.jpg,http://pictures.domain.com/e/josequervo/1234/eeefgcc7927bf1245d26c0eb19e1dc53549x.jpg,http://pictures.domain.com/e/josequervo/asee/eeefhcc7927bf1245d26c0eb19e1dc53540x.jpg,http://pictures.domain.com/e/josequervo/2341/eeefjcc7927bf1245d26c0eb19e1dc53544x.jpg","two",three","four","five","six","seven","eight","nine","forty"
이 URL과 쉼표를 제거해야 합니다.
http://pictures.domain.com/e/josequervo/0083/eeef8cc7927bf1245d26c0eb19e1dc53545x.jpg,
csv 파일의 처음 2행만 게시했지만 파일의 행이 300~400개이므로 이 이미지를 2행에서 마지막 행까지 제거해야 합니다. 첫 번째 줄은 변경할 수 없습니다.
답변1
GNU를 사용하면 sed
다음과 같이 이 문제를 해결할 수 있습니다.
sed -e '
s/","/&\n/30
s/\n[^,]*,//
' file.csv
이는 다음과 같이 이해될 수 있습니다:
","
현재 줄에서 해당 문자열이 30번째로 나타나는 위치에 자리 표시자를 배치합니다.그런 다음 자리 표시자부터 첫 번째 쉼표까지 모든 것을 삭제합니다.
또 다른 방법은 다음과 같습니다.
perl -F'/","/' -lane 'my $i;
print join q[","], map { $i++ == 30 ? substr($_, 1+index($_, ",")) : $_ } @F;
' input-file.csv
방법:
Perl은 csv 파일을 한 줄씩 읽고 각 줄마다 문자열 주위로 분할
","
하고 분할된 요소를 @F 배열에 저장합니다.그런 다음 31번째 요소의 경우 첫 번째 쉼표 앞의 모든 항목을 삭제합니다.
답변2
귀하의 질문에 따르면 이미지는 쉼표로 구분된 31열에 있으며 31열에서 첫 번째 문자를 제거해야 합니다.
awk -F "," '{$31=substr($31,2);print $0}' file.csv
테스트를 거쳤으며 잘 작동합니다. 궁금한 점이 있으면 알려주세요.