从列中解析文本

从列中解析文本
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

因为我已经得到了上述格式的日志文件。现在我需要解析它,输出应如下所示(如果行数据重复,则通过比较第三列和第四列,仅显示第一行和最后一行。

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逐行读取输入并运行每行的代码。
  • -a将空白处的每个输入行拆分到 @F 数组中。
  • $c3和$c4用于保留第3列和第4列的先前值,实际值存储在$F[2]和$F[3]中(数组从0开始索引)。
  • $previous 存储前一行,以防我们需要打印它。
  • $printed 只是防止将最后一行打印两次(如果其第 3 列和第 4 列与前一行不同,则会发生这种情况)。

答案2

awk

awk '!first[$3, $4]{ first[$3, $4]= $0 } { last[$3, $4]= $0 }
    END{ for (x in last) print first[x] (last[x] != first[x]? ORS last[x]:"") }' infile
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
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

关联first的数组使用column#3和column#4的键组合保留第一个出现的行,但该last数组每次都使用相同的键保存最新的行。

读取所有行后,first数组中的值是最先出现的行(具有不同的列#3、#4),而 中的值last是最后出现的行。

然后在END打印时将值保存在firstarray 中,然后保存在last.当该行是唯一没有重复的第 3 列和第 4 列组合的唯一行时,这(last[x] != first[x]? ORS last[x]:"")用于防止重复该行。

答案3

在这种情况下,您也可以只采用唯一的行来比较第 3,4 列,然后附加最后一行。但是,如果所有其他行具有不同的第三列和第四列,则这可能会导致最后一行重复。

然后只需将另一个管道添加到 uniq 中即可根据需要删除。

{uniq <your_file> -f2; tail -n1 <your_file>; } | cat | uniq

-f 此处跳过前 2 个空格分隔字段。

答案4

第一个变体

paste -d'\n' <(uniq -f2 input.txt) <(tac input.txt | uniq -f2 | tac) | uniq

第二种变体

awk '
$3$4 == prev {
    buf = $0 ORS
}
$3$4 != prev {
    print buf $0
    prev = $3$4
    buf = ""
}
END {
    printf("%s", buf)
}' input.txt

测试

输入(测试复杂)

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
2018-05-25 00:18:12 8.8.1.8 8.8.4.4
2018-05-25 00:18:23 8.8.1.8 8.8.4.4
2018-05-25 00:19:40 8.8.1.8 8.8.4.4
2018-05-25 00:19:51 8.8.1.8 8.8.4.4
2018-05-25 00:39:51 8.8.2.8 8.8.4.4
2018-05-25 00:49:52 8.8.2.8 8.8.4.4
2018-05-25 00:59:51 8.8.2.8 8.8.4.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
2018-05-25 00:18:12 8.8.1.8 8.8.4.4
2018-05-25 00:19:51 8.8.1.8 8.8.4.4
2018-05-25 00:39:51 8.8.2.8 8.8.4.4
2018-05-25 00:59:51 8.8.2.8 8.8.4.4

相关内容