조건이 충족되면 sed를 사용하여 두 번째 열에 문자열을 추가합니다.

조건이 충족되면 sed를 사용하여 두 번째 열에 문자열을 추가합니다.

CSV 파일:

A,12345,hello
B,67890,hi
A,123456,yo

A예상 출력: 첫 번째 열이 다음과 같은 경우 두 번째 열 끝에 두 개의 0을 추가해야 합니다.

A,1234500,hello
B,67890,hi
A,12345600,yo

답변1

데이터가 쉼표, 따옴표 및 줄 바꿈이 포함된 필드를 포함할 수 있는 일반 CSV 파일인 경우 CSV 인식 도구를 사용해야 합니다.밀러( mlr) 변환:

$ mlr --csv -N put -S '$1 == "A" { $2 .= "00" }' file
A,1234500,hello
B,67890,hi
A,12345600,yo

이렇게 하면 데이터를 헤더 없는 CSV 레코드로 읽고 이를 00두 번째 필드 값의 끝에 추가합니다(첫 번째 필드 값이 다음과 같은 경우) A. 하위 명령 -S의 옵션을 사용하면 putMiller는 숫자든 문자열이든 상관없이 모든 레코드를 문자열로 처리합니다.

Miller는 내부 편집에 해당 옵션을 사용할 수 있습니다 -I.


데이터가 헤더리스 형식인 경우단순한CSV 형식은 쉼표, 따옴표 또는 개행(CSV에서 특별한 따옴표가 필요한 형식)이 포함된 필드를 포함하지 않음을 의미하며 이를 사용하여 다음을 awk변환할 수 있습니다.

$ awk -F , 'BEGIN { OFS=FS } $1 == "A" { $2 = $2 "00" }; 1' file
A,1234500,hello
B,67890,hi
A,12345600,yo

여기서 쉼표로 구분된 필드는 awk;로 읽습니다. 첫 번째 필드가 인 경우 A문자열이 00두 번째 필드에 추가됩니다. 후행 별도 출력 은 (수정 가능) 레코드 1입니다 .awk


sed편리하거나 유지 관리 가능한 방식으로 구조화된 문서를 편집하는 데는 실제로 적합하지 않습니다. 데이터가 헤더리스 형식인 경우단순한A,CSV 형식의 경우 문자열로 시작하는 줄을 일치시키고 해당 줄에서 두 번째로 나타나는 쉼표 앞에 두 개의 0을 삽입하여 이를 수행할 수 있습니다 .

$ sed '/^A,/ s/,/00,/2' file
A,1234500,hello
B,67890,hi
A,12345600,yo

...하지만 sed레코드나 필드에 대한 개념이 없으며 각 입력 줄을 일반 텍스트 문자열로 처리합니다.

sed의 표현 에서는/^A,/주소후속 대체 명령에 사용됩니다. 즉, s이 정규식과 일치하는 모든 줄(문자열로 시작하는 줄 A,)에 명령이 적용됩니다. 경기 교체두번째2표현식이 맨 마지막에 있으므로 해당 줄에 쉼표를 추가하고 해당 문자열로 대체 합니다 00,.

편집기에서 이에 상응하는 편집 명령은 "이 정규식과 일치하는 모든 줄에 다음 대체 항목을 적용합니다" ed입니다 . 이는 표현식의 끝 부분을 이해하는 경우에도 작동합니다(그렇지는 않습니다).g/^A,/ s/,/00,/2vi2

답변2

Raku(이전 Perl_6) 사용

~$ raku -ne 'my @a = .split(",");  \
             if @a[0] eq "A" {@a.[1] ~= "00"};  \
             .put for @a.join(",");'   file

위 코드는 다음 용도로만 사용할 수 있습니다.단순한-CSV, 즉 이스케이프/따옴표가 필요한 특수 문자가 없습니다(예: 포함된 쉼표, 포함된 큰따옴표, 포함된 줄 바꿈). 기본적으로 -ne각 행에 대해 다음을 수행합니다.

  1. split,쉼표 에 ,
  2. 첫 번째 요소가 "A" 문자열인 경우 00두 번째 요소의 끝에 연결된 조건을 실행한 다음[1][0]eq
  3. out의 put요소는 join쉼표로 다시 그룹화됩니다.

입력 예:

A,12345,hello
B,67890,hi
A,123456,yo

예제 출력:

A,1234500,hello
B,67890,hi
A,12345600,yo

더 복잡한 CSV가 있거나 더 강력한 솔루션을 원한다면 Raku Text::CSV모듈을 사용하세요.

~$ raku -MText::CSV -e 'my @a = csv( in => $*IN, sep => ",");  \
         for @a -> $a {$a.[1] ~= "00"  if  $a.[0] eq "A"};  \
         csv( in => @a, out => $*OUT);'  file

TSV 파일 sep => ","과 같은 입력 파일에 적합한 구분 기호로 변경할 수 있습니다 . \t예제 출력은 위와 동일합니다.

https://raku.land/github:Tux/Text::CSV
https://raku.org

관련 정보