我有一个输入文件(input.txt)如下。
id1 id2 name weight
53723848 12651711 timburnes 1.36667
53530214 12651711 timburnes 1.51191
53723848 53530214 timburnes 1.94
764157 52986038 ericcartman 0.861145
56797854 764157 ericcartman 1.35258
56797854 52986038 ericcartman 1.73781
请注意,第一行不是实际文件的一部分,为清楚起见,我在此处添加了它。
我想提取的值id1
,并id2
以2个名为独立文件unique.txt和duplicate.txt。
如果我的weight
列值大于1.5,则表示我有重复的id。在这种情况下,我会将id1
值移到unique.txt
文件,将id2
值移到duplicate.txt
文件。
如果我的体重栏小于1.5,则表示我没有重复的值。所以,在这种情况下,我将移动都id1
和id2
到unique.txt文件。
因此,对于上述输入,我希望输出为
对于unique.txt文件,
53723848 timburnes
764157 ericcartman
56797854 ericcartman
对于重复的.txt文件,
12651711 timburnes
53530214 timburnes
52986038 ericcartman
我可以使用以下代码找出重复项。
要基于第4列获得大于1.5的值,
awk -F" " '$4 >= 1.5 { print $1" " $2" " $3" " $4}' file1.txt > Output.txt
现在,对于大于1.5的值,我可以使用下面的代码根据重复的ID合并它们的名称。
perl -ane 'foreach(@F[0..1]){$k{$F[2]}{$_}++}
END{
foreach $v (sort keys(%k)){
print "$_ " foreach(keys(%{$k{$v}}));
print "$v\n"
};
} ' Output.txt
但是,我无法以上述方式获得所需的输出。
编辑:
我正在为我的输入运行命令,如下所示。
awk '{
if ($4 > 1.5) {
if (++dup[$2] == 1) print $2, $3 > "duplicate.txt"
}
else
if (++uniq[$1] == 1) print $1, $3 > "unique.txt"
}' << END
17412193 43979400 ericcartman 2.16667
21757330 54678379 andrewruss 0.55264
END
我得到的输出是,
-bash-3.2$ cat unique.txt
21757330 a.andreev
-bash-3.2$ cat duplicate.txt
43979400 ericcartman
但是,我期望的输出是
cat unique.txt
17412193 ericcartman
21757330 andrewruss
54678379 andrewruss
cat duplicate.txt
43979400 ericcartman
这是awk
解决方案:
$ awk '
$4 < 1.5 {
uniq[$1] = $3;
uniq[$2] = $3;
next;
}
{
uniq[$1] = $3;
dup[$2] = $3;
delete uniq[$2];
}
END {
print "--unique.txt--";
for(i in uniq) {
print i,uniq[i]
}
print "";
print "--duplicate.txt--";
for(i in dup) {
print i,dup[i]
}
}' file
--unique.txt--
764157 ericcartman
56797854 ericcartman
53723848 timburnes
--duplicate.txt--
53530214 timburnes
52986038 ericcartman
12651711 timburnes
与您的第二个示例:
$ awk '
$4 < 1.5 {
uniq[$1] = $3;
uniq[$2] = $3;
next;
}
{
uniq[$1] = $3;
dup[$2] = $3;
delete uniq[$2];
}
END {
print "--unique.txt--";
for(i in uniq) {
print i,uniq[i]
}
print "";
print "--duplicate.txt--";
for(i in dup) {
print i,dup[i]
}
}' << END
> 17412193 43979400 ericcartman 2.16667
> 21757330 54678379 andrewruss 0.55264
END
--unique.txt--
21757330 andrewruss
54678379 andrewruss
17412193 ericcartman
--duplicate.txt--
43979400 ericcartman
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句