列のテキストの解析

列のテキストの解析
2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:58:23 8.8.8.8 8.8.4.4
2018-05-24 23:59:40 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4

上記の形式のログファイルがあるためです。これを解析し、出力は次のようになります。 (行データが重複している場合は、3番目と4番目の列を比較して、最初と最後の行のみを表示します。

2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4

ベストアンサー1

Perlが構造に来ます:

perl -ane '
    if ($F[2] ne $c3 || $F[3] ne $c4) {
        $printed or print $previous;
        $printed = print;
    } else {
        $printed = 0;
    }
    ($c3, $c4, $previous) = (@F[2, 3], $_);
    END { print $previous unless $printed }
' -- input.file
  • -n入力した内容を1行ずつ読み、各行のコードを実行します。
  • -a各入力行をスペースの @F 配列に分割します。
  • $ c3と$ c4は、3列と4列の古い値を保持するために使用され、実際の値は$ F [2]と$ F [3](0から始まるインデックス配列)に格納されます。
  • $previousは印刷する必要がある場合に備えて前の行を保存します。
  • $printedは、最後の行が2回印刷されるのを防ぎます(3番目と4番目の列が前の行と異なる場合に発生します)。

おすすめ記事