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
打印时将值保存在first
array 中,然后保存在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