(sed 또는 sh의 대안) 줄에 점(.)이 포함되어 있지 않은 경우. 그런 다음 끝에 XX를 추가하세요.

(sed 또는 sh의 대안) 줄에 점(.)이 포함되어 있지 않은 경우. 그런 다음 끝에 XX를 추가하세요.

배경 정보: 두 프로그램 간의 데이터 교환은 csv를 통해 이루어집니다.

프로그램 1의 다음 CSV가 있습니다.

> timestamp; name ; value 
> 1655709562;Var 1 Float;65.0 
> 1655709562;Var 2 Float;3.32 
> 1655709562;Var 1 Integer;**2** 
> 1655709562;Var 2 Integer;**564**

프로그램 2의 경우 "값"이 항상 동일한 날짜 유형일 것으로 예상하므로 이를 다음과 같이 변환해야 합니다.

timestamp; name ; value
1655709562;Var 1 Float;65.0
1655709562;Var 2 Float;3.32
1655709562;Var 1 Integer;**2.0**
1655709562;Var 2 Integer;**564.0**

나는 for 루프와 if 함수를 사용하여 그것을 보여주려고 노력할 것입니다. 그것이 그것을 보여주는 가장 좋은 방법이라고 생각하기 때문입니다.

for $line in $file
do
 If $line contains NOT "." 
  then
    add ".0" at the end of line
 end_if
done

답변1

에서 sed구문은 다음과 같습니다.

sed '/\./!s/$/.0/' < file.in > file.out

즉, 현재 행이아니요( !)는 \.정규식(리터럴 점)과 일치하며, s정규식의 첫 번째 항목을 대체합니다 $( $줄 끝과 일치) XX.

awk같은

awk '! index($0, ".") {$0 = $0 ".0"}
     {print}' < file.in > file.out

부분 문자열 검색을 수행 하는 데 사용됩니다 index(). sedwith 와 같은 정규식 일치를 수행할 수도 있습니다 ! /\./.

그리고 perl:

perl -lpe '$_ .= ".0" if index($_, ".") < 0' < file.in > file.out

또는 정규 표현식을 사용하세요.

perl -lpe '$_ .= "XX" unless /\./' < file.in > file.out

를 사용하면 파일을 제자리에서 편집하는 perl옵션을 추가할 수 있습니다 -i(이 경우 표준 입력에서 파일을 여는 대신 경로를 인수로 전달해야 함). 일부 sed구현에서는 이 옵션을 차용합니다. 최신 버전의 GNU에서는 이를 달성하기 위해 1을 구현 awk했습니다 .-i /usr/share/awk/inplace.awk

이들 모두에서 a .0도 헤더 행에 추가됩니다. 해당 행에는 .s도 포함되어 있지 않기 때문입니다.

.0아마도 더 나은 접근 방식 은 줄 끝 ;뒤에 하나 이상의 소수 자릿수가 오는 경우 추가하는 것입니다 .

sed '/;[0123456789]\{1,\}$/ s/$/.0/'

또는 일부의 경우 sed:

sed -E '/;[0123456789]+$/ s/$/.0/'
awk '/;[0123456789]+/{$0 = $0 ".0"}
     {print}'
perl -lpe '$_ .= ".0" if /;\d+$/'

^사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

관련 정보