我正在尝试捕获并读入$line
file
中只有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"