텍스트 처리 - 각 줄의 처음과 끝에서 두 번째를 바꿉니다.

텍스트 처리 - 각 줄의 처음과 끝에서 두 번째를 바꿉니다.

내 CSV 파일에 문제가 있어 인용문을 추가해야 합니다.

존재하다

field,field2,text field with potential commas,field4,field5
field,field2,text fie,ld with pot,ential commas,field4,field5
field,field2,text field with, potential commas,field4,field5

나가

field,field2,"text field with potential commas",field4,field5
field,field2,"text fie,ld with pot,ential commas",field4,field5
field,field2,"text field with, potential commas",field4,field5

sed 's/,/,"/2'첫 번째 인용문을 추가할 것입니다. 하지만 끝에서부터 뒤로 각 줄의 두 번째 항목에 대해 어떻게 동일한 작업을 수행합니까?

sed, awk, Perl 및 기타 방법을 사용하는 것을 환영합니다. 파일에는 수백만 줄이 있으며 속도가 빠릅니다.

답변1

한 가지 접근 방식은 다음과 같습니다 awk. 쉼표로 구분된 필드가 5개보다 많은 경우 이를 연결하는 "중간" 필드를 반복한 다음 따옴표로 묶인 새 필드를 인쇄하고 마지막 두 필드를 인쇄합니다.

awk -f awkscript.awk < input

다음과 같이 awkscript.awk:

BEGIN {
  OFS=","
  FS=","
}
{
        if (NF > 5) {
                middle=""
                for(i=3; i <= NF-2; i++)
                        middle=(middle ? middle"," : "")$i
                print $1, $2, "\""middle"\"", $(NF-1), $NF
        } else {
                print $1, $2, "\""$3"\"", $4, $5
        }
}

답변2

이것을 사용하면 sed다음을 수행할 수 있습니다.

sed 's/,/,"/2; s/\(,[^,]*,[^,]*\)$/"\1/' infile

이는 s/,/,"/2두 번째 것만 대체합니다. 이는 역참조에 대한 그룹 일치로 줄 끝에서 일치한 s/\(,[^,]*,[^,]*\)$다음 따옴표를 추가한 후 교체 섹션에서 다시 가져옵니다.,anything-not-a-comma,anything-not-a-comma$\1"\1

답변3

이는 매우 간단한 접근 방식이지만 아마도 가장 효율적이지는 않을 것입니다.

sed 's/,/,"/2' input.csv | rev | sed 's/,/,"/2' | rev > output.csv

답변4

sed -e '
   s/,/&\n/2
   s/\n\(.*\)\(,.*,.*\)/"\1"\2/
'    input.csv


 perl -pe '
    my $p;
    while ( /,/g ) {
       s/\G/"/,next if ++$p == 2;

       last if s/,\G(?=.*,)(?!.*,.*,)/",/;  # looks for 2nd last comma
    }
 '    input-file.csv



 perl -pe '
      substr($_, index($_, q/,/, 1+index($_, q/,/)), 1) = q/,"/;

      substr($_, rindex($_, q/,/, -1+rindex($_, q/,/)), 1) = q/",/;
 '     csvfile

여기서는 왼쪽에서 두 번째 쉼표의 위치를 ​​얻기 위해 index 함수를 두 번 호출합니다. 이제 위치가 결정되었으므로 substr 함수를 사용하여 옆에 따옴표를 붙입니다.

이번에도 rindex 함수를 호출하고 그에 따라 변경합니다.

관련 정보