CSV 파일이 있습니다. 다음과 같습니다.
chr22, Position , A , B , C , D , E
22 , 16050115 , 0|0:404 , 0 , 0 , 0 , 1|1:5
22 ,16050213 ,0|0:403 , 0 , 0 , 0 , 3|4:6
22 , 16050607 , 1|0:340 , 1|1:3, 0 , 0 , 1|1:3
22 16050737 , 0|0:402 , 3|0:4 , 0|7:23 , 0 , 0
22 16050783 , 0|0:404 , 2|2:5 , 0|1:31 , 1|0:51, 0
0|0:404
0|0
는 의 개수를 나타냅니다 404
. 0|0
의 1|0
값을 추출하고 싶은데 0|1
출력은 다음 1:1
과 같아야 합니다.
chr22, Position, A ,B, C ,D, E
22 ,16050115, 0|0:404 ,0 ,0 ,0 ,1|1:5
22 ,16050213, 0|0:403, 0 ,0, 0, 0
22 ,16050607, 1|0:340, 1|1:3, 0 ,0 ,1|1:3
22 ,16050737, 0|0:402, 0 ,0 ,0, 0
22 ,16050783, 0|0:404 ,0 ,0|1:31 ,1|0:51, 0
시도해 보았지만 grep -e '0|0:' -e '1|1:' -e '0|1:' -e '1|1 /path/file.csv
작동하지 않는 것 같습니다.
답변1
원래 명령줄
다음 명령줄은 "문제가 있는" 줄을 건너뛰고 쉼표로 구분된 파일로 이 작업을 수행할 것이라고 생각합니다.
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
OP의 의견에 대한 명령줄 응답
아래 명령줄은 OP가 원하는 쉼표로 구분된 파일과 탭으로 구분된 파일을 수행할 것이라고 생각합니다.
sed -e 's/[2-9]|[0-9]:[0-9]*/NA/' -e 's/[0-9]|[2-9]:[0-9]*/NA/' file.csv
답변2
grep
이것이 요구 사항인지 확실하지 않지만 을 사용하면 perl
다음을 수행하여 원치 않는 항목을 제거할 수 있습니다.
perl -pe 's/, ?[2-9]\d*\|\d+:\d+//g; s/, ?\d+\|[2-9]\d*:\d+//g' /path/to/file.csv
답변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