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


9

.csv파일 에 열 (2 위)을 추가하고 싶고 해당 열의 값이 문자열이되고 인용되기를 원합니다.

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

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"이됩니다.

어떻게해야합니까?


파일에 2 개 이상의 열이있는 경우 두 번째 열을 삽입하거나 바꾸시겠습니까?
ctac_

바로 첫 번째 후 열 삽입
pkaramol

2
좋아, 그래서 당신은 사용해야합니다 삽입 : AWK는 '{FS = OFS = ","} {$ 1 = $ 1 ", \"2.4.0 \ ""} 1 BEGIN'
ctac_

1
또는 AWK '{하위 ( ",", ", \"2.4.0 \ ",")} 1'
ctac_

답변:


12

따옴표가 잘못되었습니다. 아래와 같이해야합니다

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

이것은 GNU awk man page-3.2 Escape Sequences에 설명되어 있습니다.

일부 문자는 문자 그대로 문자열 상수 ("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 }'

1
@roaima : 내가 아는 것에서, 그것은 단지 취소되어 { print 2.4.0 }또는 결과적으로 또는를 초래합니다 ( { print 2.4.0 + 0 }예 : 문자열이 아닌 구성 요소). 관련 문서도 검색하려고했지만 검색 할 수 없었습니다.
Inian

2
내가 가끔 사용하는 따옴표를 편리하게 추가하는 또 다른 방법은 다음과 같은 변수를 정의하는 것입니다.awk -v q='"' '... print q "2.4.0" q ...
Thor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.