bash 以捕获特定的模式实例并排除其他实例



我正在尝试捕获并读入$linefile中只有del的行(第 2 行就是一个例子(。第 3 行包含del,但它也有ins,执行时的bash当前捕获两者。我不确定如何排除除del之外的任何内容,并且只捕获这些行。谢谢:)。

文件

NM_003924.3:c.765_779dupGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC
NM_003924.3:c.765_779insGGCAGCGGCGGCAGC

期望的输出

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

带电流输出的 bash

while read line; do
if [[ $line =~ del ]] ; then echo $line; fi
done < file
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC

你能尝试以下吗(如果可以的话awk(。

awk '/del/ && !/ins/'  Input_file

尝试:

while read -r line; do
[[ $line =~ del && ! $line =~ ins ]] && printf '%sn' "$line"
done < file

修改后的代码也是ShellCheck干净的,避免了BashPitfall #14。

如果文件中的最后一行没有终止换行符,则此解决方案可能会失败。 如果这是一个问题,请参阅接受的答案,即在逐行读取文件时读取 bash 脚本中文件的最后一行以进行修复。

这是一个sed的解决方案。它否定匹配del后跟ins,并打印包含del的所有内容。-n使每隔一个输出静音。

$ sed -n -e '/del.*ins/!{/.*del.*/p}' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

这是使用启用 PCREgrep的另一个答案。这应该适用于GNU grep中的-P选项

$ grep -P 'del.*(?!.*ins)' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

将其分为两步。您不需要循环:

grep "del" file | grep -v "ins"

最新更新