awk가 예기치 않게 문자열에서 점을 제거합니다.

awk가 예기치 않게 문자열에서 점을 제거합니다.

파일에 열(두 번째 위치)을 추가하고 .csv해당 열의 값을 문자열로 인용하고 싶습니다.

다음 명령은 따옴표 없이 열을 추가합니다.

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

다음 방법은 따옴표를 병합하지만 어떤 이유로 .값에서 마지막 점(점)을 제거합니다.

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

따라서 내 값은 "2.40"이 됩니다.

나는 무엇을 해야 합니까?

답변1

따옴표를 잘못 입력하신 것 같습니다. 다음과 같이 해야 합니다.

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

이것은GNU awk 매뉴얼 페이지 - 3.2 이스케이프 시퀀스

("foo")특정 문자는 문자열 상수 나 정규식 상수( ) 에 문자 그대로 포함될 수 없습니다 /foo/. 대신 \백슬래시( )로 시작하는 문자 시퀀스 인 이스케이프 시퀀스로 표시해야 합니다 . 이스케이프 시퀀스의 한 가지 용도는 문자열 상수에 큰따옴표 문자를 포함하는 것입니다. 일반 큰따옴표는 문자열을 끝내기 때문에 \"실제 큰따옴표 문자를 문자열의 일부로 나타내는 데 사용해야 합니다 .


동작의 이유를 이해할 수 있는 한, OP의 추가 따옴표가 있는 숫자 단어로 awk해석되어 2.4.0첫 번째 지점 이후 정밀도를 잃기로 결정한 것 같습니다.

$2="\""2.4.0"\""

정의로워지다

$2=""2.4.0""

awk더 이상 문자열로 이해되지 않습니다 . 다음을 수행하면 이 동작을 재현할 수 있습니다.

awk 'BEGIN { print ""2.4.0"" }'
2.40

이렇게 하면 결과는 이렇게 된다

awk 'BEGIN { print 2.4.0 + 0 }'

관련 정보