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
我有 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