我有一個輸入檔(輸入.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
到兩個名為唯一.txt和重複.txt。
如果我的weight
列值大於 1.5,則表示我有重複的 ID。在這種情況下,我會將id1
值移至unique.txt
文件並將id2
值移至duplicate.txt
文件。
如果我的體重列小於 1.5,則表示我沒有重複值。因此,在這種情況下,我將把 和id1
都id2
移至 唯一.txt文件。
因此,對於上述輸入,我期望輸出為,
為了唯一.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
答案1
這是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
答案2
$ 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
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
END
$ cat unique.txt
53723848 timburnes
764157 ericcartman
56797854 ericcartman
$ cat duplicate.txt
12651711 timburnes
53530214 timburnes
52986038 ericcartman
答案3
這是一個 Perl 的:
perl -lane '$F[3]>1.5 ? print STDERR "$F[1] $F[2]" : print STDOUT "$F[0] $F[2]"'\
input.txt 2> duplicate.txt > unique.txt
我不會在這裡檢查重複項,如果我正確理解您的問題,那麼您已經這樣做了,並且某些內容是否是重複的取決於最後一個字段的值。如果我誤解了某些內容,請告訴我,我會更新。
上面的程式碼產生
$ cat duplicate.txt
12651711 timburnes
53530214 timburnes
52986038 ericcartman
$ cat unique.txt
53723848 timburnes
764157 ericcartman
56797854 ericcartman