기호 일치 목록을 검색하여 CSV의 두 번째 열에 있는 문자열을 바꾸거나 수정하는 방법에 대한 조언이 필요합니다.
이것은 내 파일입니다.csv
[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12.18.l,ch17,12.1
2,yo11`18.p,ch18,13.5
3,qk13_18.q,ch19,22.6
4,ls15-18.r,ch20,23.7
5,ew16'18.s,ch21,24.9
sed/awk를 실행한 후 예상되는 결과는 다음과 같습니다.
[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12_18_l,ch17,12.1
2,yo11_18_p,ch18,13.5
3,qk13_18_q,ch19,22.6
4,ls15-18_r,ch20,23.7
5,ew16_18_s,ch21,24.9
검색이 일치하면 아무 작업 -
도 _
수행하지 않습니다. 검색어가 일치하면 ,
<
`
'
밑줄 기호를 사용하여 바꿔야 합니다 _
.
몇 가지 조합을 사용해 보았지만 awk
작동하지 않습니다.
awk -F, -v OFS=, 'sub(/\.\`\>\'/,"_",$2)+1' file.csv
어떤 아이디어라도 감사하겠습니다
답변1
편집하다:
OP가 데이터를 편집했기 때문에. awk
대신 지금 사용하는 것이 더 좋습니다 sed
.
awk 'BEGIN{FS=OFS=","}/^[0-9]+,/{gsub(/[\.<`\x27]/,"_",$2);print;next}1' file.csv
답변2
그리고 perl
:
perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e' -- "$file"
( ) 이외의 하나 이상의 ( ) 문자와 하나 이상의 ( ) 십진수 및 줄 시작( +
) 뒤의 하나(일치 시작 재설정)가 ( ) 이외의 문자로 대체되는 경우 동일한 ( ) ord 문자(숫자 또는 밑줄) 또는 로 대체됩니다.,
[^,]
^
+
\d
\d
,
\K
$&
\w
-
_
따라서 실제로 첫 번째 필드가 모두 십진수로 구성된 경우 alnum을 제외한 문자 _
와 두 번째 필드의 문자를 대체합니다.-
파일의 특정 테이블에 대한 일치를 제한하려면 다음을 수행할 수 있습니다.
perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e if
/^SL,Name/ .. /^\[/' -- "$file"
로 시작하는 줄 SL,Name
과 로 시작하는 다음 줄 사이에서만 이러한 교체를 수행합니다 [
.
파일의 내부 편집을 사용하여 파일의 각 줄에 대한 표현식을 평가하는 패턴을 적용합니다 -i
( 줄은 저장되고 기본 변수는 다음과 같습니다.-p
sed
-e
$_
s/pattern/replacement/flags
패턴 공간존재하다 sed
).