У меня есть файл с разделителями табуляции, который выглядит следующим образом:
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
Количество полей в каждой строке фиксировано и одинаково. Я хочу удалить эти строки из вышеуказанного файла, где все поля для каждой строки от столбца 2 до последнего является NA. Тогда вывод должен выглядеть так:
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
text-processing
awk
perl
bioinformatics
user3138373
источник
источник
\s\d
различие между «хорошими» и «плохими» строками.is.na
проверкой, если я думаюОтветы:
С
awk
:Переберите поля, начинающиеся со второго поля, и напечатайте строку, если
NA
найдено не содержащее поле . Тогда разорви петлю.источник
Использование GNU sed
Краткое объяснение:
g[0-9]\+\(\s*NA\s*\)\+$
это совпадение с регулярным выражением,g
за которым следует хотя бы одна цифра, затем любое числоNA
s с необязательными пробелами между до конца строки.sed -e '/<regex>/d'
удаляет все совпадающие строки<regex>
Более стандартное регулярное выражение с тем же значением будет:
источник
\+
и\s
являются нестандартными регулярными выражениями и будут соответствовать простым+
илиs
в большинствеsed
версий. Используйте\{1,\}
вместо\+
и[[:space:]]
вместо\s
иметь переносимый код.С
all
помощью модуля Perl List :: Util:источник
С
grep
:Это заставляет grep не отображать
-v
строки ( ), где-x
совпадает вся строка ( ):источник
{4}
вместо*
послеNA
группы, и вы можете изменить первый[[:blank:]]*
в ,[[:blank:]]+
чтобы сделать пробельные разделители обязательным. Несмотря на это, я никогда не понимал, почему все настаивают на том, чтобы вытащитьawk
базуку для решения этих простых задач фильтрации, которыеgrep
легко решаются .*
чтобы это решение одинаково хорошо работало для любого произвольного числаNA
столбцов, если они все являются NA.Вы можете попробовать:
источник