gpt4 book ai didi

linux - 仅列出基于分号分隔文件中一列的重复行?

转载 作者:IT王子 更新时间:2023-10-28 23:56:15 26 4
gpt4 key购买 nike

我有一个包含很多行的文件。这些行中的每一行都有 8 个以分号分隔的列。

我如何(在 Linux 中)返回重复行但仅基于第 2 列?我应该使用 grep 还是其他东西?

最佳答案

在 awk 脚本中查看我的注释

$ cat data.txt 
John Thomas;jd;301
Julie Andrews;jand;109
Alex Tremble;atrem;415
John Tomas;jd;302
Alex Trebe;atrem;416

$ cat dup.awk
BEGIN { FS = ";" }

{
# Keep count of the fields in second column
count[$2]++;

# Save the line the first time we encounter a unique field
if (count[$2] == 1)
first[$2] = $0;

# If we encounter the field for the second time, print the
# previously saved line
if (count[$2] == 2)
print first[$2];

# From the second time onward. always print because the field is
# duplicated
if (count[$2] > 1)
print
}

示例输出:

$ sort -t ';' -k 2 data.txt | awk -f dup.awk

John Thomas;jd;301
John Tomas;jd;302
Alex Tremble;atrem;415
Alex Trebe;atrem;416

这是我的解决方案#2:

awk -F';' '{print $2}' data.txt |sort|uniq -d|grep -F -f - data.txt

这个解决方案的美妙之处在于它以同时使用许多工具(awk、sort、uniq 和 fgrep)为代价保留了行顺序。

awk 命令打印出第二个字段,然后对其输出进行排序。接下来,uniq -d 命令挑选出重复的字符串。此时,标准输出包含重复的第二个字段的列表,每行一个。然后我们将该列表通过管道传输到 fgrep。 '-f -' 标志告诉 fgrep 从标准输入中查找这些字符串。

是的,你可以用命令行全力以赴。我更喜欢第二种解决方案,因为它可以使用许多工具并获得更清晰的逻辑(至少对我而言)。缺点是工具的数量和可能使用的内存。此外,第二种解决方案效率低下,因为它扫描数据文件两次:第一次使用 awk 命令,第二次使用 fgrep 命令。这种考虑仅在输入文件很大时才重要。

关于linux - 仅列出基于分号分隔文件中一列的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1450085/

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