linux - OSX 和 Linux 之间的 Grep 差异
问题描述
我编写了一个需要三个用户输入的脚本:
- 文本文件的名称,其行对应于染色体和碱基对位置,例如
extract.txt
. - 要在文本文件中搜索并提取值的 VCF 文件的名称,即
test.vcf
. - 包含从中提取的行的新 VCF 文件的所需输出名称
test.vcf
对于那些不熟悉 VCF 文件的人来说,有很多复杂的标题信息,但在这个问题上下文中唯一重要的标题行是以 . 开头的最终标题行#CHROM
。这些文件之一的玩具示例如下所示(注意:在 VCF 文件中,这些列是制表符分隔的,但我不确定如何在此处格式化):
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT
Chr06 5567134 . T C 999 PASS DP=13782;VDB=0.0302;AF1=0.7154;AC1=1312;DP4=1987,2142,4337,4552;MQ=39;FQ=999;PV4=0.49,1.5e-10,0,1 GT:PL:DP:SP:GQ
Chr06 5567140 . G A 999 PASS DP=13537;VDB=0.0304;AF1=0.7489;AC1=1374;DP4=1744,1858,4383,4621;MQ=39;FQ=999;PV4=0.8,0.068,0,1 GT:PL:DP:SP:GQ
Chr06 5567195 . G T 999 PASS DP=12016;VDB=0.0284;AF1=0.384;AC1=704;DP4=3311,4518,1537,1850;MQ=37;FQ=999;PV4=0.0026,0,0,1 GT:PL:DP:SP:GQ
Chr06 5567224 . TAAAAA TAGAAACAAAAA 999 PASS INDEL;DP=13190;VDB=0.0352;AF1=0.1229;G3=0.7854,0.1806,0.03405;HWE=1.71e-05;AC1=225;DP4=4930,5006,542,685;MQ=40;FQ=999;PV4=0.00035,1,0,1 GT:PL:DP:SP:GQ
Chr06 5567247 . T A 999 PASS DP=14383;VDB=0.03;AF1=0.1233;G3=0.7772,0.1986,0.02415;HWE=0.022;AC1=226;DP4=6484,6134,587,654;MQ=41;FQ=999;PV4=0.0062,9.3e-07,0,0.16 GT:PL:DP:SP:GQ
Chr06 5567444 . TAAAAAA TAAAAAAA 999 PASS INDEL;DP=10303;VDB=0.0235;AF1=0.6037;G3=0.1784,0.4375,0.3841;HWE=0.0162;AC1=1107;DP4=1996,2224,2158,2446;MQ=46;FQ=999;PV4=0.7,1,6.3e-30,1 GT:PL:DP:SP:GQ
Chr06 5567497 . AG A 999 PASS INDEL;DP=5243;VDB=0.028;AF1=0.07142;G3=0.873,0.08398,0.04299;HWE=0.000541;AC1=131;DP4=2297,2010,0,146;MQ=46;FQ=999;PV4=0,0,0.00097,0 GT:PL:DP:SP:GQ
Chr06 5567499 . TAAA TGGCCAAATAAGCCACTCAAAAGAAATACAGCCAAAAACATCTACAAA 999 PASS INDEL;DP=5243;VDB=0.0273;AF1=0.3508;G3=0.4662,0.2686,0.2652;HWE=1.95e-12;AC1=643;DP4=1993,1638,195,545;MQ=46;FQ=999;PV4=0,1,5.1e-18,0 GT:PL:DP:SP:GQ
Chr06 5567583 . G C 999 PASS DP=12372;VDB=0.0279;AF1=0.09276;AC1=170;DP4=4794,5928,512,569;MQ=42;FQ=999;PV4=0.095,1,5.5e-31,1 GT:PL:DP:SP:GQ
Chr06 5567628 . G T 999 PASS DP=12657;VDB=0.0244;AF1=0.1049;AC1=192;DP4=5230,6194,197,578;MQ=40;FQ=999;PV4=1.2e-29,9.8e-06,0,1 GT:PL:DP:SP:GQ
要提取的项目的 txt 文件的玩具示例如下所示:
Chr06\t5567140
Chr06\t5567583
Chr06\t5567224
我创建了这个 txt 文件以明确包含染色体和位置值之间的 VCF(制表符)分隔符。
当我在本地 OSX 计算机上测试它时,我有一个 bash 脚本。
这是我的 bash 脚本:
#!/bin/bash
# Reset getopts
OPTIND=1
usage="$(basename "$0") [-h] [-i] [-v] [-o] -- program to extract loci from VCF files
where:
-h show this help text
-i input text file containing loci to extract
CHR and BP columns must be separated by appropriate delimiter
-v VCF file to extract loci from
-o output file name
"
# Read in variables
while getopts ":hi:v:o:" opt; do
case "$opt" in
h) echo "$usage"
exit
;;
i)
input=$OPTARG
;;
v)
vcf=$OPTARG
;;
o)
output=$OPTARG
;;
esac
done
echo
echo "File containing SNP positions: '$input'"
echo "VCF file to extract from: '$vcf'"
echo "Output filename: '$output'"
LC_ALL=C grep '#CHROM' $vcf > $output
while IFS= read -r line
do
LC_ALL=C grep "$line" $vcf >> $output
done < $input
当我将此文件上传到我的 Linux 服务器以大规模运行时,它会崩溃。while 循环中的 grep 命令 ieLC_ALL=C grep "$line" $vcf >> $output
无法匹配较大 VCF 文件中的任何内容。
故障排除,我发现如果我更改文本文件以使条目不再Chr06\t5567140
是,现在只是5567140
. 这只是证明条目包含在我正在搜索的文件中,但是在扩展 CHR-tab-BP 模式以匹配时出现了一些问题。
显然,我可以更改所有文本文件并解决问题,但这会使我的工具不那么通用,我现在只是好奇为什么这个脚本在本地工作但在服务器上失败。
非常感谢任何帮助,或对如何改进我现有代码的评论。如果关于这个问题的任何内容不清楚,请告诉我。
谢谢!
编辑:
我得到了脚本工作。我只需要更改我的文本文件格式以使用实际的制表符而不是文字\t
。using 在 OSX 上有效但在 Linux 上无效的事实\t
表明 OSX grep 能够解释这个字符,而 GNU grep 则不能(正如@Sundeep 在下面的评论中指出的那样)。将此编辑放在这里,以防将来有人遇到类似问题。
解决方案
推荐阅读
- git - 从未合并的分支分支时,如何在 Git 中停止无意义的合并冲突?
- javascript - readTextFile 函数返回未定义。为什么?
- python - Flask-SQLAlchemy 加入并按时间戳获取最大值
- ios - 找不到嵌入在应用程序包中的按需资源
- ios - 我的 Apple 推送服务不起作用……我已经创建了一个新服务,但我仍然没有收到通知。有谁知道会发生什么?
- ios - 带有 PageTabViewStyle 的 TabView 屏幕中的背景不会填满整个可用的垂直空间
- python - Python - '错误:AudioFileOpen 失败('wht?')',在乒乓球游戏上播放音频文件
- python - 我将如何检查我的扫雷游戏的所有相邻单元格?
- itext7 - 在 CssContentPropertyResolver 中实现目标计数器
- graphql - 如何设置 mqtt 客户端永久收听主题?