我的输入文件看起来像
Chr1 1
Chr1 2
Chr2 3
,我想根据第一列中的CHR将输入文件分为多个文件。
应该有两个输出文件输出文件1(命名为tmpchr1):
Chr1 1
Chr1 2
输出文件2(命名为tmpchr2):
Chr2 3
这是到目前为止的代码:
#!/bin/bash
for((chrom=1;chrom<30;chrom++)); do
echo Chr${chrom}
chr=Chr${chrom}
awk "$1==$chr{print $1}" input.txt > tmp$chr
done
行awk "$1==$chr{print $1}"
是问题所在,Awk似乎需要$ CHR左右的报价才能正确匹配$ 1
awk '$1=="Chr1"{print $1}'
工作和TMPCHR1
awk '$1=="$chr"{print $1}'
不起作用
awk "$1=='$chr'{print $1}"
真的很挣扎着报价,任何人都可以阐明我应该做的事情吗?
切勿在尴尬脚本周围使用双引号,也切勿允许Shell变量作为AWK脚本正文的一部分展开。请参阅http://cfajohnson.com/shell/cus-faq-2.html#q24
不过,您的一般方法已经不在意。您需要的只是这个尴尬脚本:
awk '{print > ("tmp"$1)}' file
看:
$ ls
file
$ cat file
Chr1 1
Chr1 2
Chr2 3
$ awk '{print > ("tmp"$1)}' file
$ ls
file tmpChr1 tmpChr2
$ cat tmpChr1
Chr1 1
Chr1 2
$ cat tmpChr2
Chr2 3
每当您在外壳中编写循环以操纵文本时,您都有错误的方法。Unix Shell是一个用语言调用工具以对这些调用进行测序的环境。操纵文本的Unix工具很尴尬。因此,如果您需要用Unix操纵文本,请写一个尴尬脚本并从Shell中调用它,仅此而已。