匹配文件的第一列与awk,引号有困难

时间:2015-05-04 21:18:15

标签: bash awk

我的输入文件如下所示

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}"

也没有

真的在报价上挣扎,有人能说明我应该做些什么吗?

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调用它,就是这样。