2013-10-30 94 views
-1

所以這個問題困擾着我,我還有一百萬個其他項目要去,所以我希望能夠清楚這一點。到目前爲止,我還沒有找到答案。看起來很簡單。我用:

awk '$1' merged_counts.txt |sort|uniq -d|wc 

並得到了216行。但是,這個數字是不正確的。如果我用

more merged_counts.txt|cut -f 1|sort|uniq -d|wc 

我得到271行,這是正確的。如果我使用

awk '{print $1}' merged_counts.txt |sort|uniq -d|wc 

我也得到271行,但是,那麼我也失去了其餘的領域。我無法弄清楚爲什麼它看起來像是一件基本的事情。感謝您的任何幫助/建議。當然,我必須俯視一些東西。文件的

實施例:

B3GALT1 72 128 65 124 87 118 102 117 38 106 87 115 27 20 89 30 
AMY1A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
PSENEN 654 459 648 462 508 399 537 532 696 460 625 473 621 322 633 434 

基因「AMY1A」是在兩個DNA鏈註釋所以它在我的文件中出現兩次的那些基因中的一個。

+0

順便說一句,我的問題是爲什麼我得到216和271.我知道使用awk打印將擺脫其餘的領域。謝謝! – user2937872

+0

您正在使用'more'(一個交互式程序),您應該使用'cat',或者甚至更好'cut -f 1 chepner

+0

我的壞習慣。我腦子裏的某些東西只允許我使用貓,如果我真的要連接某些東西的話。 – user2937872

回答

2

我在看到你說的I need to keep the entire line, but I need to filter for duplicates based only on the first field的評論中看到了,所以讓我們從這開始,讓我們進一步假設你的字段被任何空格分開,並且總是希望在發生重複時打印第一行。

你會使用然後awk命令是:

awk '!seen[$1]++' file 

現在 - 更新說明,輸入和輸出你的問題告訴我們您需要什麼。

+0

我已經編輯了我的問題,提供了一些更詳細的信息,而不會給予太多的幫助。 – user2937872

1

cut使用單個字符(tab默認,但可改變經由-d選項)以單獨的字段,而awk使用空白的任何運行(默認,經由-F選項改變)。

awk '$1'打印整個行$1不被視爲錯誤,而不僅僅是第一個字段。這會導致更少的重複行(因爲兩行可能具有相同的第一個字段,但在後續字段中不同)以及較低的行數。

+0

嗨@chepner。我知道我可以在cut和awk中更改分隔符。事情是,我需要保持整條線路,但我需要僅基於第一個字段篩選重複項。我知道有271個重複項。最終目標是將一個簡短的字符串附加到副本中,以便進行另一個不允許重複基因名稱的分析。我想我明白你對awk'$ 1'的評價。但那我怎麼能保持整條線路,但只過濾第一個字段? – user2937872

+0

'awk'中有一個標準的技巧:'awk'uniq [$ 1] {uniq [$ 1] ++; ...}''只會在'$ 1'之前沒有被觀察到時處理一行。它所做的第一件事是存儲該字段,因此它將忽略具有相同「$ 1」的任何未來行。 – chepner

2

awk '$1'(不要與awk '{print $1}'混淆)將要打印的一切只是是空或者只包含空白,或其中第一場的計算結果爲0的數字值cut -f 1不會做此線,並且將包括空白和只有空白的行。

+0

在這種情況下,空白行和空白行不是一個問題。這個25k +行文件中的重複序列來自在正向和反向鏈上註釋過的基因,因此在我的最終文件中出現兩次。有些我可以很容易地抓到,其他人一直在逃避我的腳本。 :/ – user2937872

+0

...或$ 1的值爲零的行。 –

+1

@EdMorton良好的捕捉...更新。 – twalberg

相關問題