gpt4 book ai didi

unix - 有没有办法根据特定列提取所有重复记录?

转载 作者:行者123 更新时间:2023-12-01 15:00:57 25 4
gpt4 key购买 nike

我正在尝试从管道分隔文件中提取所有(仅)重复值。

我的数据文件有 80 万行和多列,我对第 3 列特别感兴趣。因此,我需要获取第 3 列的重复值并从该文件中提取所有重复行。

但是,我能够实现这一目标,如下所示。

cat Report.txt | awk -F'|' '{print $3}' | sort | uniq -d >dup.txt

我将上面的内容循环起来,如下所示..

while read dup
do
grep "$dup" Report.txt >>only_dup.txt
done <dup.txt

我也尝试过awk方法

while read dup
do
awk -v a=$dup '$3 == a { print $0 }' Report.txt>>only_dup.txt
done <dup.txt

但是,由于文件中有大量记录,因此需要很长时间才能完成。所以我正在寻找一种简单快捷的替代方案。

例如,我有这样的数据:

1|learning|Unix|Business|Requirements
2|learning|Unix|Business|Team
3|learning|Linux|Business|Requirements
4|learning|Unix|Business|Team
5|learning|Linux|Business|Requirements
6|learning|Unix|Business|Team
7|learning|Windows|Business|Requirements
8|learning|Mac|Business|Requirements

我的预期输出不包括唯一记录:

1|learning|Unix|Business|Requirements
2|learning|Unix|Business|Team
4|learning|Unix|Business|Team
6|learning|Unix|Business|Team
3|learning|Linux|Business|Requirements
5|learning|Linux|Business|Requirements

最佳答案

这可能就是您想要的:

$ awk -F'|' 'NR==FNR{cnt[$3]++; next} cnt[$3]>1' file file
1|learning|Unix|Business|Requirements
2|learning|Unix|Business|Team
3|learning|Linux|Business|Requirements
4|learning|Unix|Business|Team
5|learning|Linux|Business|Requirements
6|learning|Unix|Business|Team

或者如果文件太大,所有键($3 值)无法放入内存(对于 800,000 行中唯一的 $3 值来说,这不应该是问题):

$ cat tst.awk
BEGIN { FS="|" }
{ currKey = $3 }
currKey == prevKey {
if ( !prevPrinted++ ) {
print prevRec
}
print
next
}
{
prevKey = currKey
prevRec = $0
prevPrinted = 0
}

$ sort -t'|' -k3,3 file | awk -f tst.awk
3|learning|Linux|Business|Requirements
5|learning|Linux|Business|Requirements
1|learning|Unix|Business|Requirements
2|learning|Unix|Business|Team
4|learning|Unix|Business|Team
6|learning|Unix|Business|Team

关于unix - 有没有办法根据特定列提取所有重复记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58527076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com