説明する

説明する

frz4番目の列がORであるいくつかのデータがあります-frz次の行の4番目の列だけが4番目の列であるすべての行を見つけて、その2行を印刷したいと思います-

入力例:

2018-04-09T14:15:23.366Z  7 multi -   uuid1 uuid2 uuid3 -
2018-04-09T14:15:23.978Z  8 multi frz   uuid1 uuid3 -        -
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T00:35:54.338Z  9 multi -   uuid1 uuid2 -        -
2018-06-28T00:47:51.679Z  9 multi -   uuid1 uuid2 uuid3 -
2018-06-28T00:47:51.720Z 10 multi -   uuid1 uuid3 -        -
2018-06-28T00:47:58.863Z 10 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

予想出力:

2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

一致後に行を印刷するいくつかのコマンドが見つかりましたawkが、これらの2行を一致させ、両方を印刷する方法がわかりません。

私が現在持っているもの:

$ awk 'f{print;f=0} $4=="frz"{f=1}' input
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

答え1

どうですか?

awk '$4=="-" && prev4=="frz" {print prevline; print} {prev4 = $4; prevline=$0}' file

答え2

GNU grepがあり、パターンがデータの他の場所に表示されない場合は、次のことを試してください。

grep -A1 frz | grep -vB1 frz

説明する

最初は、grepパターンが発生するすべての行をキャプチャし、次もキャプチャします。

-A NUM、--after-context = NUM​​行を一致させた後、NUM行末尾のコンテキストを印刷します。連続して一致するグループ間にグループ区切り記号(--)を含む行を配置します。

サンプル入力の最初のコマンド出力は次のとおりです。

2018-04-09T14:15:23.978Z  8 multi frz   uuid1 uuid3 -        -
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
--
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

次に、2番目のコマンドはその行を検索します。いいえパターンを含み、前の行と一緒に印刷します。

-B NUM, --before-context=NUM 行を一致させる前に先行コンテキストの NUM 行を印刷します。連続して一致するグループ間にグループ区切り記号(--)を含む行を配置します。

で述べたようにgrep のマニュアルページ、出力にはグループ区切り記号(--)が含まれています。

2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
--
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

grep必要に応じて3番目の項目を追加して削除できます。

grep -A1 frz | grep -vB1 frz | grep -v '^--$'

答え3

私は完全に非実用的なGNUアプローチを提供したいと思いますgrep。動作しますが、ひどいようです。

grep -Pzo "^\S+\s+\S+\s+\S+\s+frz\s+.*\n\S+\s+\S+\s\S+\s+\-\s+.*" input

はい。

$ cat file
2018-04-09T14:15:23.366Z  7 multi -   uuid1 uuid2 uuid3 -
2018-04-09T14:15:23.978Z  8 multi frz   uuid1 uuid3 -        -
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T00:35:54.338Z  9 multi -   uuid1 uuid2 -        -
2018-06-28T00:47:51.679Z  9 multi -   uuid1 uuid2 uuid3 -
2018-06-28T00:47:51.720Z 10 multi -   uuid1 uuid3 -        -
2018-06-28T00:47:58.863Z 10 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
$ grep -Pzo "^\S+\s+\S+\s+\S+\s+frz\s+.*\n\S+\s+\S+\s\S+\s+\-\s+.*" file
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
$ grep -V 2>&1|head -1
grep (GNU grep) 2.20
$

答え4

このsedを試してみることもできます。

sed -E '
  /([^ ]* *){3}frz .*/!d
  $!N
  /(.*\n)([^ ]* *){3}- .*/!D
' infile

関連情報