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

bash to find non-redundant data across multiple fields

我有 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[]{a[]=[=10=]} END{for (i in a) print a[i]}' file
  • !a[] 检查数组 a 是否不包含由要检查的所需字段组成的键

  • 如果键不存在,{a[]=[=14=]}是运行即创建一个数组元素,以所需字段为键,整条记录为值

  • 最后,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[]{a[]=[=11=]} 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

你也可以awk看下图;

awk '!seen[]++' yourFile

awk -F , '!seen[]++' file1

例如;

user@host $ awk '!seen[]++' file1
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

sort:

$ sort -u -t, -k4,4 -k6,6 -k7,7 -k8,8 file
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3

或@potong 在评论中建议,更短:

sort -ut, -k4,4 -k6,8 file