ループで sed を使用する

ループで sed を使用する

.txt次の構造のファイルがあります。

20170515000650883,208,-32,-896,stand
20170515000651883,336,96,-928,stand
20170515000652982,368,64,-896,stand
20170515000653982,256,-48,-816,lie
20170515000654982,368,48,-832,lie
20170515000655982,15081,32,-688,lie
20170515000656982,15081,48,-864,lie
20170515000657983,15081,112,-1072,lie
20170515000658983,15081,-32,-992,lie
20170515000659983,15081,-48,-1072,lie
20170515000700983,15081,-32,-880,lie
20170515000701983,15081,16,-832,stand
20170515000702983,15081,-48,-720,stand
20170515000703983,15081,0,-896,stand
20170515000704983,15081,112,-880,lie
20170515000705983,15081,-48,-1072,lie
...

lie私の目標は、最後の列に表示されたイベントを検索することです。これが私が悟ったもの

sed -n '13,$s/lie/&/p' $subj > $SUBJECTS_DIR/temp.txt

私は13行目から検索を開始し、「嘘」を含むすべての行を一時ファイルに保存しました。しかし、sedコマンド中にデータを収集できますか?最初の列にはタイムスタンプが含まれています。したがって、lie = TRUEのときにcolumn_1から値を収集したいと思います。また、シーケンスの最後の嘘が発生した場合(合計8つの「嘘」)時差。検索はファイルの最後まで続ける必要があります。その期間中にこの情報を収集する方法を知っている人はいますか? sed?

答え1

これにはawkを使用できます。

awk -F"," '/lie/{a[++i>2?2:i]=$1}END{print a[2] - a[1] }' input.txt

awkコマンドは、「lie」に一致する最初の最後のタイムスタンプを配列に格納します。ファイルを読み取った後、awk は最後の一致から最初の一致を引いたものです。

答え2

「視差」が何であるかはわかりませんが、「嘘」を含む最初の列は次のように単純に拡張できます。

cat data.txt | grep lie | sed "s/,.*,lie//g"

grep「うそ」がないすべての行を削除し、sed最初の列を除くすべての行を削除します。

その後、配列に変換し、bashで目的の数を使用できます

答え3

この記事を投稿するには遅すぎる可能性があります。

sed  -nE '13,$ s/([^,]*).*lie$/\1/p' in.txt

どこ:

  • -nE:

    • -n は --quiet, --silent を表します。パターンスペースを自動的に印刷しません。
    • -E--regexp-extended : 拡張正規表現の使用
  • ([^,]*):タイムスタンプキャプチャ

  • .*lie$ :行が「嘘」で終わっていることを確認してください。

したがって: 行13で始まる「うそ」のタイムスタンプを返します。

関連情報