bash跨多个字段查找非冗余数据

标签 bash awk sed redundancy uniq

我有 10 个数据字段,其中包含冗余和非冗余数据。我想 grep/sed/awk/uniq/whatever 来制作一个非冗余列表。

具体来说,我想消除在字段 4、6、7 和 8 中具有相同条目的条目。但是我需要保留这些条目中的一个(第一个)。

这里和示例输入

1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3

1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

1, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 3

1, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6

1, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

2, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 4

2, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

2, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 4

2, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6

2, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

这是一个示例输出

1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3

1, 3972365,4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

这只是一个示例,有时这些条目中只有一个不同,必须保留在最终输出中。

非常感谢!

最佳答案

做:

awk -F "[ ,]+" '!a[$4$6$7$8]{a[$4$6$7$8]=$0} END{for (i in a) print a[i]}' file
  • !a[$4$6$7$8]检查数组 a 是否不包含由要检查的所需字段组成的 key

  • 如果 key 不存在,{a[$4$6$7$8]=$0}运行,即创建一个数组元素,其中所需的字段作为键,整个记录作为值

  • 最后,END{for (i in a) print a[i]}打印数组 a 的值

示例:

% cat file.txt
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 3
1, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6
1, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6
2, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 4
2, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
2, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 4
2, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6
2, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

% awk -F "[ ,]+" '!a[$4$6$7$8]{a[$4$6$7$8]=$0} END{for (i in a) print a[i]}' file.txt
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3

关于bash跨多个字段查找非冗余数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40083933/

相关文章:

linux - 如何从 TXT 或 CSV 中删除具有特定模式的行

bash - 无法在通过 Atlantis(Terraform Pull Request Automation)工具运行的 terraform local-exec 配置程序中设置环境变量

bash - 使用 bash 排序 rfc 日期

unix - awk 错误 : "cannot open - too many open files"

linux - AWK 使用的替代方案

linux - 从 BASHRC 解析函数

mysql - 从 bash 输出 sql 输出

Bash 脚本错误 : [: missing ]

awk - 使 awk 余数运算符像 Python 一样工作

bash - 获取特定字符串