背景情報: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()
。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
おそらくより良いアプローチは、行の末尾;
に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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'