추가 공백으로 불규칙한 제목 변경

추가 공백으로 불규칙한 제목 변경

데이터를 처리 중이에요이 모호한 파일 형식:

   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합니다 .awkperlpython

답변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발전했습니다 .perlsed

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 I0therperl

perl -pi -e 's/(?<!\S)(F\d+)\s+(I\d+)(?!\S)/${1}_${2}/g if $. == 1' file

우리는 부정 탐색 연산자를 사용하여 앞뒤에 공백이 아닌 문자가 없는지 확인합니다.

관련 정보