将结果从函数设置为变量并附加 - 不一致

时间:2017-01-05 09:59:33

标签: bash variables awk

我需要将函数的结果从变量中获取,然后我想将结果作为新列追加到同一个文件中。我正在使用以下代码(从$ 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

任何人都可以解释问题的位置或提出另一种解决方案吗?

2 个答案:

答案 0 :(得分:1)

看起来min的值有时是意料之外的,因为你没有引用它 - 你应该(!);) - 它会在shell中分词。看起来$min的值类似于

foo bar A ...
#  ^   ^ space

让shell调用以下

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

的命令行

答案 1 :(得分: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并在第二次运行时搜索。