배경 정보: 두 프로그램 간의 데이터 교환은 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()
. sed
with 와 같은 정규식 일치를 수행할 수도 있습니다 ! /\./
.
그리고 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
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'