(sedまたはshの代替)行にドット(.)が含まれていない場合。次に、最後にXXを追加します。

(sedまたはshの代替)行にドット(.)が含まれていない場合。次に、最後にXXを追加します。

背景情報:2つのプログラム間のデータ交換は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おそらくより良いアプローチは、行の末尾;に1つ以上の小数点以下の数字がある場合に追加することです。

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

または一部の場合sed

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

^使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

関連情報