我有一个文件,其中字段用";“分隔,如下所示:
test;group;10.10.10.10;action2
test2;group;10.10.13.11;action1
test3;group3;10.10.10.10;action3
tes4;group;10.10.10.10;action4
test5;group2;10.10.10.12;action5
test6;group4;10.10.13.11;action8我想标识所有非唯一的IP地址(第3列)。对于该示例,提取应为:
test;group;10.10.10.10;action2
test3;group3;10.10.10.10;action3
tes4;group;10.10.10.10;action4
test2;group;10.10.13.11;action1
test6;group4;10.10.13.11;action8按IP地址排序(第3列)。
Ssing简单的命令,如cat,uniq,sort,awk (不是Perl,不是Python,只有shell)。
有什么想法吗?
发布于 2018-04-19 20:52:30
$ awk -F';' 'NR==FNR{a[$3]++;next}a[$3]>1' file file|sort -t";" -k3
test;group;10.10.10.10;action2
test3;group3;10.10.10.10;action3
tes4;group;10.10.10.10;action4
test2;group;10.10.13.11;action1
test6;group4;10.10.13.11;action8发布于 2018-04-19 20:58:56
您还可以使用grep、cut、sort、uniq和中间的临时流程替换来尝试此解决方案。
grep -f <(cut -d ';' -f3 file | sort | uniq -d) file | sort -t ';' -k3它并不是很优雅(实际上我更喜欢上面给出的awk答案),但我认为值得分享,因为它实现了你想要的东西。
发布于 2018-04-19 21:29:47
这与Kent的答案非常相似,但只有一次遍历文件。权衡的是内存:您需要存储要保留的行。这使用GNU awk作为PROCINFO变量。
awk -F';' '
{count[$3]++; lines[$3] = lines[$3] $0 ORS}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (key in count)
if (count[key] > 1)
printf "%s", lines[key]
}
' file等价的perl
perl -F';' -lane '
$count{$F[2]}++; push @{$lines{$F[2]}}, $_
} END {
print join $/, @{$lines{$_}}
for sort grep {$count{$_} > 1} keys %count
' filehttps://stackoverflow.com/questions/49921461
复制相似问题