как сохранить строки с определенной строкой

Следуя моему предыдущему вопросу , как я могу хранить строки только с одним генотипом, отличным от N?

ANNANNANNNN NNNCNNNNNNN NNNNNNGNNNN NNNTNNNNNNN GNNNGNNNNNN CNNCNCNNNNN 

мой желаемый результат:

 NNNCNNNNNNN NNNNNNGNNNN NNNTNNNNNNN 

 sed -n '/^[N ]*[^N ][N ]*$/p' input.txt 

Печатает строки, содержащие только один символ, отличный от N.

Или, то же самое, но по-другому.

 sed '/[^N ][N ]*[^N ]/d; /^[N ]*$/d' input.txt 

Во-первых, он удаляет все строки, содержащие более одного символа, отличного от N , а затем удаляет строки, содержащие только N символов.

 grep -x '[N ]*[^N ][N ]*' 

Для одного и только одного не-N.

 grep -v '[^N ].*[^N ]' 

Для не более одного не-N (также соответствует пустым строкам или строкам только с N s).

Поскольку на входе, по-видимому, содержатся только символы из переносного набора символов, вы можете исправить локаль на C, чтобы ускорить работу ( LC_ALL=C grep... ).

Вы можете создать скрипт, содержащий:

 #!/bin/sh while read i do n=`echo $i | tr " " "\n" | uniq -c | grep "N" | awk '{print $1}'` if [ "$n" == "10" ] then echo $i fi done < "$1" 

затем предоставить права выполнения для вашего скрипта:

 $ chmod +x myScript.sh 

а затем запустите его

 $ ./myScript.sh myFile.txt 

Затем вы можете обойти, сколько N вы хотите на своей линии, изменяя

если ["$ n" == "10"]

Не очень элегантный, но он выполняет свою работу и ничего не требует

Использование awk . Пропустить пустое / пустое пространство (вкладки + / пробелы) / Только строки N и отпечаток, где видна только один не-N генотип.

 awk -F'[^N \t]' 'NF==2' 

Другой ответ sed:

 sed -n 'h; s/[N ]//g; /^.$/ {g; p}' file 

или awk

 awk ' { n=0 for (i=1; i<=NF; i++) { if ($i != "N") n++ if (n > 1) break } } n == 1 ' file