2017-01-05 23 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的命令行。

相关问题