繁体   English   中英

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

[英]Matching first column of file with awk, difficulty with quotes

我的输入文件如下所示

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

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

永远不要在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调用它,这就是全部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM