我的文件结构如下:
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栏有关的内容。
如何让第四列中的字母共享前三列?
答案 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