查找共享信息的行

时间:2018-06-12 13:41:16

标签: linux awk unique gnu

我的文件结构如下:

private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e) { var dirtyItem = sender as T; if (dirtyItem != null && sourceCollection.LastOrDefault() == dirtyItem) { T newRow = new T(); newRow.PropertyChanged += OnItemPropertyChanged; sourceCollection.Add(t); } }

file1.txt

我试图找出哪些字母在第1列,第2列,第3列中具有相同的信息? 例如,输出应为:

1 10 20 A
1 10 20 B
1 10 20 E
1 10 20 F
1 12 22 C
1 13 23 X
2 33 45 D
2 48 49 D
2 48 49 E

我只能通过以下方式计算出多少行是唯一的:

A
B
E
F
D
E

这不会给我任何与第4栏有关的内容。

如何让第四列中的字母共享前三列?

4 个答案:

答案 0 :(得分:2)

关注awk可能会对您有所帮助。

 awk 'FNR==NR{a[$1,$2,$3]++;next}  a[$1,$2,$3]>1' Input_file  Input_file

输出如下。

1 10 20 A
1 10 20 B
1 10 20 E
1 10 20 F
2 48 49 D
2 48 49 E

仅将最后一个字段的值更改a[$1,$2,$3]>1更改为a[$1,$2,$3]>1{print $NF}'

答案 1 :(得分:2)

处理文件一次:

awk '{k=$1 FS $2 FS $3}
     k in a{a[k]=a[k]RS$4;b[k];next}{a[k]=$4}END{for(x in b)print a[x]}' file

处理文件两次:

awk 'NR==FNR{a[$1,$2,$3]++;next}a[$1,$2,$3]>1{print $4}' file file

根据给定的例子,上面的两个单行都给出相同的输出:

A
B
E
F
D
E

注意第一个可能会生成"字母"以不同的顺序。

答案 2 :(得分:2)

充分利用两个世界......

$ awk '{print $4 "\t" $1,$2,$3}' file | uniq -Df1 | cut -f1

A
B
E
F
D
E

交换字段的顺序,要求uniq跳过第一个字段并仅打印重复项,删除比较字段。

,或者

$ rev file | uniq -Df1 | cut -d' ' -f1

A
B
E
F
D
E

如果标记名不是单个字符,则需要在末尾添加| rev

NB。两个脚本都假设数据已在比较键上排序,就像在输入文件中一样。

答案 3 :(得分:1)

另一个一遍:

$ awk ' {
    k=$1 FS $2 FS $3        # create array key
    if(k in a) {            # a is the not-yet-printed queue
        print a[k] ORS $NF  # once printed from a...
        b[k]=$NF            # move it to b
        delete a[k]         # delete from a
    }
    else if(k in b) {       # already-printed queue
        print $NF
    } else a[k]=$NF         # store to not-yet-printed queue a
}' file
A
B
E
F
D
E