我需要将函数的结果从变量中获取,然后我想将结果作为新列追加到同一个文件中。我正在使用以下代码(从$ 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
任何人都可以解释问题的位置或提出另一种解决方案吗?
答案 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
并在第二次运行时搜索。