2017-01-05 24 views
1

我需要從函數獲取結果到變量,然後我想將結果作爲新列附加到同一個文件中。我用下面的代碼(例如,對於獲得來自塔的最低值$ 2):將函數的結果設置爲變量並附加 - 不一致

min="$(cut -f2 myfile.tsv | sort -n | head -1)" 
awk -v min=$min '{print $0 "\t" min}' myfile.tsv > myfile_min.tsv 

輸入數據例如:

Backbone_1000 375 T X  
Backbone_1000 424 T EQ  
Backbone_1000 428 G EQ  
Backbone_1000 440 G EQ  
Backbone_1000 462 G EQ  
Backbone_1000 477 C EQ  
Backbone_1000 483 T EQ  
Backbone_1000 492 C EQ  
Backbone_1000 493 C EQ  
Backbone_1000 503 G EQ  

預期輸出:

Backbone_1000 375 T X 375 
Backbone_1000 424 T EQ 375 
Backbone_1000 428 G EQ 375 
Backbone_1000 440 G EQ 375 
Backbone_1000 462 G EQ 375 
Backbone_1000 477 C EQ 375 
Backbone_1000 483 T EQ 375 
Backbone_1000 492 C EQ 375 
Backbone_1000 493 C EQ 375 
Backbone_1000 503 G EQ 375 

我的問題是,它有時可以工作,下次不可以。這是我提交給羣集的更長程序的一部分。目前,我收到以下錯誤:

awk: cmd. line:1: fatal: cannot open file `A' for reading (No such file or directory) 

我在尋找什麼,我們有一個集羣上,到目前爲止,我設法找到:

2.6.18-411.el5 GNU/Linux 

誰能解釋一下是哪裏的問題或建議另一種解決方案?

+1

請填寫一些示例數據和預期結果。 –

+1

你有「myfile.tsv」作爲變量嗎?它是在「雙引號」之間嗎? – fredtantini

+0

你顯示的代碼看起來很好。但是,在真實代碼中的某處,會有一些變量與文件名無關。 – fedorqui

回答

1

如何在AWK直接與它打交道:

$ awk 'NR==1 { min=$2 } NR==FNR { if($2<min)min=$2; next } $0=$0 "\t" min' file file 
Backbone_1000 375 T X 375 
Backbone_1000 424 T EQ 375 
Backbone_1000 428 G EQ 375 
... 

它讀取file兩次,在第一次運行搜索的最小$2和outputing第二。

+0

謝謝!它解決了這個問題,它更簡單。 –

1

貌似的min值有時會出現意想不到因爲你不要引用它 - 你應該(!);) - 它會受到殼分詞的。貌似$min的價值是一樣的東西

foo bar A ... 
#^^space 

這讓殼撥打以下

awk -v min=foo bar A '{print $0 "\t" min}' myfile.tsv > myfile_min.tsv 
# min value^
# program  ^
# input files ^  ^   ^

使用此:

awk -v min="$min" '{print $0 "\t" min}' myfile.tsv > myfile_min.tsv 
# quotes ^^

當然,這不會$min解決問題本身是意想不到的,但至少它不會導致awk命令中的語法錯誤。你現在需要做的是修復設置爲$min的命令行。

相關問題