我的输入文件如下所示
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}"
真的在报价上挣扎,有人能说明我应该做些什么吗?
答案 0 :(得分:7)
永远不要在awk脚本周围使用双引号,并且绝不允许shell变量作为awk脚本主体的一部分进行扩展。见http://cfajohnson.com/shell/cus-faq-2.html#Q24
尽管如此,你仍然可以通过一般的方法。所有你需要的是这个awk脚本:
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
任何时候你在shell中编写循环只是为了操作文本你都有错误的方法。 UNIX shell是一种环境,可以使用该语言调用工具来对这些调用进行排序。用于操作文本的UNIX工具是awk。因此,如果您需要在UNIX中操作文本,请编写一个awk脚本并从shell调用它,就是这样。