タイムスタンプ(最初の列)がHHMMSS形式のcsvログファイルを読み込んでいます。ここで、HHは時間(0-23)、MMは分(0-59)、SSは2番目(0-59)です。 。
ファイルを読み取り、列データに対してさまざまな変換を実行して、タイムスタンプが変数(CURRTYMEなど)に含まれるようにしました。私の現在の変換は次のとおりです
# Data will have leading zeros and will always be 6 characters
CURRTYME="073031"
NEXTTYME=`echo $CURRTYME | sed 's/./&:/2'`
LASTTYME=`echo $NEXTTYME| sed 's/./&:/5'`
echo $LASTTYME
これは挿入を実行する最良の方法ですか、それとも1つのsedステートメントで実行できますか?
答え1
#!/bin/bash
CURTIME="073031"
echo $CURTIME | sed "s|\(..\)\(..\)\(..\)|\1:\2:\3|"
echo $CURTIME | cut -c-2,3-4,5- --output-delimiter=:
echo ${CURTIME:0:2}:${CURTIME:2:2}:${CURTIME:4:2}
最後の項目は必須ですbash
。
それとも行くかもしれませんが、awk
そんなに小さなことをするのはとても過度だと思います。
答え2
CSVファイルのタイトルが次のようになるとします。
time,data A,data B
123456,abba,baab
654321,quux,uxqu
...最初のフィールドは、次のようにtime
Miller()を使用して変換できます。NNNNNN
NN:NN:NN
mlr
$ mlr --csv put -S '$time = sub($time,"(..)(..)(..)","\1:\2:\3")' file
time,data A,data B
12:34:56,abba,baab
65:43:21,quux,uxqu
データをCSVに読み込み、置換コマンド(sub()
)を使用して、名前付きフィールドをtime
ファイル内の各レコードに必要な形式に変換します。
置換は、time
フィールドの最初の6文字をそれぞれ2文字の3つのグループに一致させ、グループ間にコロンを挿入します。サブコマンド-S
のオプションはput
フィールドタイプを推論しないため、これを数値ではなく文字列として扱うことができます。
オプションが与えられると、-I
ファイルmlr
は「その場で」編集されます。