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
의 옵션을 사용하면 put
Miller는 숫자든 문자열이든 상관없이 모든 레코드를 문자열로 처리합니다.
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,/2
vi
2
답변2
Raku(이전 Perl_6) 사용
~$ raku -ne 'my @a = .split(","); \
if @a[0] eq "A" {@a.[1] ~= "00"}; \
.put for @a.join(",");' file
위 코드는 다음 용도로만 사용할 수 있습니다.단순한-CSV, 즉 이스케이프/따옴표가 필요한 특수 문자가 없습니다(예: 포함된 쉼표, 포함된 큰따옴표, 포함된 줄 바꿈). 기본적으로 -ne
각 행에 대해 다음을 수행합니다.
split
,
쉼표 에 ,- 첫 번째 요소가 "A" 문자열인 경우
00
두 번째 요소의 끝에 연결된 조건을 실행한 다음[1]
[0]
eq
- 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
예제 출력은 위와 동일합니다.