데이터를 처리 중이에요이 모호한 파일 형식:
SNP A1 A2 F1 I1 F2 I2 F3 I3
rs0001 A C 0.02 0.00 1.99
(처음 세 필드 주위의 공백에 유의하세요)
제목이 매우 길어서(500,000개 항목) 다음과 같이 변환하고 싶습니다.
SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99
...불규칙한 공백을 제거하거나 제거하지 않고 사용하기가 더 쉽습니다. 참고로, 일관성이 있는 한 이는 허용됩니다.
SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99
Unix/Linux에서 다시 포맷할 수 있는 방법이 있습니까? 감사해요
답변1
귀하가 링크한 plink 파일 형식 사양에는 이상한 세부 정보가 많이 포함되어 있습니다.
먼저, "F1 I1" 및 "F2 I2"가 두 개의 서로 다른(그러나 관련된) 열의 헤더를 명확하게 나타내는 몇 가지 예는 다음과 같습니다.
SNP A1 A2 F1 I1 F2 I2 F3 I3
rs0001 A C 0.98 0.02 1.00 0.00 0.00 0.01
rs0002 G A 0.00 1.00 0.00 0.00 0.99 0.01
Ix
그러나 헤더가 있음에도 불구하고 열 값이 누락된 것처럼 보이는 예도 제공했습니다.
SNP A1 A2 F1 I1 F2 I2 F3 I3
rs0001 A C 0.02 0.00 1.99
이 예가 잘못된 것인지, 아니면 데이터가 실제로 이런 방식으로 형식화될 수 있는지는 확실하지 않습니다. 이 옵션과 관련된 설명은 dose1
"선량 데이터는 0..2 척도가 아니라 0..1입니다."라는 일반적인 두 열 형식 대신 한 열의 선량 데이터를 사용할 수 있음을 암시하는 것 같습니다. 내 직관으로는 하나의 값만 제공하는 예제 데이터의 제목이 혼란스러운 것 같습니다.
사양에 대한 이해와 부분적으로만 일치하는 부정확한 사양과 데이터를 처리하는 방법은 항상 어렵습니다. 잘못된 데이터에 플래그를 표시하는 동시에 사소한 헤더 문제가 있는 파일을 올바르게 처리할 수 있도록 데이터 파서의 허용 범위를 결정해야 합니다.
실제 파일 처리 질문과 관련하여: 파일에 단일 값 또는 이중 값 선량 데이터가 있는지 알려주는 외부 표시기가 있는 경우 Ix
익숙한 스크립트나 텍스트 처리 언어를 사용하여 헤더를 완전히 제거 sed
합니다 .awk
perl
python
답변2
sed
다음을 사용하여 첫 번째 줄을 덮어 쓸 수 있습니다 .
sed -E 's/(F[[:digit:]]+) (I[[:digit:]])/\1_\2/g;q' < file 1<> file
이는 첫 번째 행만 읽고 쓰기 때문에 작동합니다. 우리가 쓰고 있는 줄의 길이가 우리가 읽고 있는 줄의 길이와 정확히 같기 때문에 이는 유효한 것입니다. Fn
와 사이에 공백이 여러 개 있을 수 In
있고 공백 하나만으로 바꾸려는 경우 _
이 방법을 사용할 수 없으며 전체 파일을 다시 작성해야 합니다. 예를 들면 다음과 같습니다.
perl -pi -e 's/(F\d+)\s+(I\d)/${1}_${2}/g if $. == 1' file
file
이렇게 하면 원본 버전 역할을 하는 새로운 편집 사본이 생성됩니다 . 예를 들어 일부 sed
구현은 GNU를 사용하여 -i
발전했습니다 .perl
sed
sed -Ei '1s/(F[[:digit:]]+)\s+(I[[:digit:]])/\1_\2/g' file
작동할 것입니다. 다른 sed
구현 의 경우 -i ''
.\s
[[:space:]]
하나 이상의 공백 문자 시퀀스를 단일 공백으로 바꾸려면 s/[[:space:]]+/ /g
( 사용다음을 수행할 수 있습니다perl
-l
정규식 일치는 그다지 엄격하지 않습니다. F<digits> I<digit>
줄의 어느 곳에서나 찾으면 예를 들어 다음에서 찾을 수 있습니다. 더 엄격한 일치는 다음을 통해 수행할 수 있습니다.PAF12 I0ther
perl
perl -pi -e 's/(?<!\S)(F\d+)\s+(I\d+)(?!\S)/${1}_${2}/g if $. == 1' file
우리는 부정 탐색 연산자를 사용하여 앞뒤에 공백이 아닌 문자가 없는지 확인합니다.