Похоже, sed
не очень хорошо работает с двоичными подстановками. Я только что проверил, что вы делаете с tr
, хотя, похоже, он работает. На самом деле это довольно просто сделать с помощью одной команды, а также:
cat /path/to/file1 | tr "$(printf "\302\240")" " " > /path/to/file1_new
tr
- это инструмент для «перевода» набора символов в его первом аргументе в набор во втором аргументе (который расширен, чтобы соответствовать длине первый комплект при необходимости). Поэтому мы просто переводим каждый символ в пробел, как вы пытались сделать с sed
.
Я бы попробовал
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
Я думаю, что следующая командная строка сделает это с файлом, разделенным запятыми, пропуская «оскорбительные» строки,
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
Не уверен, что grep
является требованием для этого случая, но с помощью perl
вы можете сделать что-то подобное, чтобы удалить ненужные элементы:
perl -pe 's/, ?[2-9]\d*\|\d+:\d+//g; s/, ?\d+\|[2-9]\d*:\d+//g' /path/to/file.csv