在文件中查找uniq行,但忽略某些列

时间:2015-09-29 19:51:24

标签: bash shell unix

所以我现在四处看了几个小时,但没有发现任何有用的东西。

我想对具有大量行格式的文件进行排序,如

Values1, values2, values3, values4, values5, values6, 

但我想只返回与

唯一相关的行
Values1, values2, values3, values6

因为我有多个实例Values1,values2,values3,values6,其唯一的区别是values4,values5和我不想返回那些,而只是一行的一个实例(最好是与值4的最大值,值5,但这没什么大不了的)

我尝试过使用过     uniq -s ## 但这不起作用,因为我的值长度是可变的。

我也试过了     sort -u -k 1,3 但这似乎也无济于事。

主要是我的问题是我的值长度可变,我不关心按值排序6但是它会很好。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

使用awk,您可以第一次打印"键"看到了:

awk '
    { key = $1 OFS $2 OFS $3 OFS $6 }
    !seen[key]++
' file

魔法!seen[key]++是一个awk成语。它仅在第一次遇到该键时返回true。然后它会增加值,以便在任何后续遭遇中都不会成立。

答案 1 :(得分:0)

替代awk

cut -d" " -f1-3,6 filename | sort -u

仅提取必填字段,排序唯一

答案 2 :(得分:0)

如果您绝对不能使用@karafka建议的非常干净的cut方法,那么在输入csv文件的情况下,可以使用uniq -f <num>跳过第一个<num>唯一性比较的列。

由于uniq期望将空白作为分隔符,因此我们需要更改此值并重新排列列以满足您的要求。

sed 's/,/\t/g' textfile.csv | awk '{ print $4,$5,$1,$2,$3,$6}' | \
 sort -k3,4,5,6 | uniq -f 2 | \ 
 awk 'BEGIN{OFS=",";} { print $3,$4,$5,$1,$2,$6}'

这样,仅打印第一行值(排序后)$ 4和$ 5。