将文件的第一列与尴尬匹配,引号困难

  • 本文关键字:文件 一列 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}"

也不

真的很挣扎着报价,任何人都可以阐明我应该做的事情吗?

切勿在尴尬脚本周围使用双引号,也切勿允许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中调用它,仅此而已。

相关内容

  • 没有找到相关文章