Извлечь файл, содержащий 0|0,0|1,1|0 и 1|1

Похоже, sed не очень хорошо работает с двоичными подстановками. Я только что проверил, что вы делаете с tr , хотя, похоже, он работает. На самом деле это довольно просто сделать с помощью одной команды, а также:

cat /path/to/file1 | tr "$(printf "\302\240")" " " > /path/to/file1_new

tr - это инструмент для «перевода» набора символов в его первом аргументе в набор во втором аргументе (который расширен, чтобы соответствовать длине первый комплект при необходимости). Поэтому мы просто переводим каждый символ в пробел, как вы пытались сделать с sed .

1
14.12.2018, 12:46
3 ответа

Я бы попробовал

grep -e '[01]|[01]:' 

где |нужно экранировать, так как 0|1означает либо 0, либо 1.

обратите внимание, что

grep -e '0|0:' -e '1|1:' -e '0|1:' -e '1|1:'

совпадают.

фильтрация по столбцу:

awk -F, '$3 ~/[01]|[01]:/ '

, где $3— третий столбец.

фильтрация столбца 3 и выше

awk -F, '{printf "%s,%s",$1,$2 ; 
      for(i=3;i<=NF;i++) 
        if ( $i  ~ /[01]\|[01]:/) 
           printf ",%s",$i ; 
      printf "\n" }' 

который может быть однострочным.

  • обратите внимание, что |в этом случае нужно экранировать.
  • обратите внимание, что первая строка отфильтрована

    chr22,Position
    22,16050115,0|0:404,1|1:5
    22,16050213,0|0:403
    22,16050607,1|0:340,1|1:3,1|1:3
    22,16050737,0|0:402
    22,16050783,0|0:404,0|1:31,1|0:51
    
0
27.01.2020, 23:23

Исходные командные строки

Я думаю, что следующая командная строка сделает это с файлом, разделенным запятыми, пропуская «оскорбительные» строки,

grep -v -e ', *[2-9]|' -e '|[2-9]:' file.csv

Можно проверить с помощью небольшого файла с цветом,

grep -v -e ', *[2-9]|' -e '|[2-9]:' file.csv |grep --color '.|.'

и какие строки найдены поgrep(исключены в предыдущих командных строках по опции -v),

grep -e ', *[2-9]|' -e '|[2-9]:' file.csv |grep --color '.|.'

Следующая командная строка сделает это с файлом, разделенным табуляцией,

grep -v -e '\t[2-9]|' -e '|[2-9]:' Reddy.tab

или, если вам нужна более слабая проверка, может работать следующая командная строка:

grep -v -e '[2-9]|' -e '|[2-9]:' Reddy.tab file.csv

Командная строка в ответ на комментарий ОП

Я думаю, что следующая командная строка будет делать то, что хочет ОП, с файлами, разделенными запятыми, а также с файлами, разделенными табуляцией,

sed -e 's/[2-9]|[0-9]:[0-9]*/NA/' -e 's/[0-9]|[2-9]:[0-9]*/NA/' file.csv
2
27.01.2020, 23:23

Не уверен, что grepявляется требованием для этого случая, но с помощью perlвы можете сделать что-то подобное, чтобы удалить ненужные элементы:

perl -pe 's/, ?[2-9]\d*\|\d+:\d+//g; s/, ?\d+\|[2-9]\d*:\d+//g' /path/to/file.csv
1
27.01.2020, 23:23

Теги

Похожие вопросы