我有一個由制表符分隔的兩列檔案,如下所示:
OG0000000 PF03169,PF03169,PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,PF00083,PF07690,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,PF00012,
我只想洗掉第二列中的重復字串,同時不更改第一列中的任何內容,因此我的最終輸出如下所示:
OG0000000 PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,
我試圖通過使用 awk 來啟動它。
awk 'BEGIN{RS=ORS=","} !seen[$0] ' file.txt
但是我的輸出看起來是這樣的,如果重復的字串首先出現,那么仍然有一些重復。
OG0000000 PF03169,PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,PF07690,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,PF00012,
我意識到問題是因為 awk 抓取的第一行是第一個逗號之前的所有內容,但我對 awk 命令仍然很粗魯,無法弄清楚如何在不弄亂第一列的情況下解決這個問題。提前致謝!
uj5u.com熱心網友回復:
這awk應該適合你:
awk -F '[\t,]' '
{
printf "%s", $1 "\t"
for (i=2; i<=NF; i) {
if (!seen[$i] )
printf "%s,", $i
}
print ""
delete seen
}' file
OG0000000 PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,
PS:根據顯示的預期輸出,此解決方案還在每行中顯示一個尾隨逗號。
uj5u.com熱心網友回復:
另一種方法使用相同的 spit of$2到一個陣列中,并為發布的非重復值的位置保留一個單獨的計數器,可以這樣做:
awk '
{
printf "%s\t", $1
delete seen
n = split($2,arr,",")
pos = 0
for (i=1;i<=n;i ) {
if (! (arr[i] in seen)) {
printf "%s%s", pos ? "," : "", arr[i]
seen[arr[i]]=1
pos
}
}
print ""
}
' file.txt
示例輸出
在 中輸入file.txt,輸出為:
OG0000000 PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E ':a;s/(\s .*(\b\S ,).*)\2/\1/;ta' file
遍歷一行,洗掉空格后的任何重復字串。
uj5u.com熱心網友回復:
使用 GNUsed
$ sed -E ':a;s/([^ \t]*[ \t] )?(([[:alnum:]] ,).*)\3/\1\2/;ta' input_file
OG0000000 PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,
uj5u.com熱心網友回復:
使用您顯示的示例和嘗試,請嘗試以下awk代碼。不需要設定RS,ORS分別是Record separator和Output record separator,本需求不需要設定。相應地設定 FS 和 OFS,并列印欄位。
awk '
BEGIN{ FS=","; OFS="\t" }
{
val=""
delete arr
num=split($2,arr,",")
for(i=1;i<=num;i ){
if(!arr[$i] ){
val=(val?val ",":"") $i
}
}
print $1,val
}
' Input_file
uj5u.com熱心網友回復:
這是紅寶石:
ruby -ane 'puts "#{$F[0]}\t#{$F[1].split(/(?<=.),(?=.)/).uniq.join(",")}"' file
OG0000000 PF03169,MAC1_004431-T1,
OG0000002 PF07690,PF00083,PF00083,
OG0000003 MAC1_000127-T1,
OG0000004 PF13246,PF00689,PF00690,
OG0000005 PF00012,PF01061,PF12697,PF00012,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/536284.html
標籤:壳awksed
