2개의 값마다 단일 특정 열을 여러 열로 분할

2개의 값마다 단일 특정 열을 여러 열로 분할

5개 필드(5번째 필드 너비 = 200000개 값[0과 1])가 있는 유전자형 파일이 있습니다.

MA,30009,4,4,000010000111101011111000110100000000 .......
ME,30067,3,2,000010000111101011111000110100000000 .......
MI,30032,7,8,000010000111101011111000110100000000 .......

마지막 필드를 2개의 값마다 여러 열로 분할하고 싶습니다(ncol = 100000). 출력이 다음과 같기를 원합니다.

MA,30009,4,4,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00 .......
ME,30067,3,2,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00 .......
MI,30032,7,8,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00 .......

어? 돌팔이 의사? sed?

도움이 필요하세요? 미리 감사드립니다

답변1

awk 'BEGIN{FS=OFS=","}{gsub(/../,"&,",$NF)}1' file
  • BEGIN{FS=OFS=","}필드 구분 기호를 로 설정합니다 ,.
  • {gsub(/../,"&,",$NF)},마지막 필드( ) $NF에서 2자마다 추가됩니다 .
  • 1결과 라인을 인쇄합니다.

결과:

MA,30009,4,4,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00,

위 명령으로 생성된 후행 쉼표를 제거하려면 추가 sub기능을 사용하여 제거하십시오.

awk 'BEGIN{FS=OFS=","}{gsub(/../,"&,",$NF);sub(/,$/,"",$NF)}1' file
MA,30009,4,4,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00

답변2

루프와 함께 Sed를 사용할 수 있습니다.

$ sed -E -e :a -e 's/(,[^,]{2})([^,]{1,})$/\1,\2/;ta' file
MA,30009,4,4,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00
ME,30067,3,2,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00
MI,30032,7,8,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00

(처음부터 시작하여 거꾸로 작업하는 더 깔끔한 방법이 있다고 생각 $하지만 완전히 확신할 수는 없습니다.) (확장 정규식) 패턴 -E은 필요하지 않습니다. 단지 이스케이프를 단순화할 뿐입니다.

또는 Perl을 사용하십시오.

$ perl -F, -lne '$last = pop @F; print join ",", @F, $last =~ m/(..)/g' file
MA,30009,4,4,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00
ME,30067,3,2,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00
MI,30032,7,8,00,00,10,00,01,11,10,10,11,11,10,00,11,01,00,00,00,00

답변3

GNU awk 마지막 필드를 두 번째 필드에 병합한 다음 필드 수를 줄입니다.

gawk -F ',' -v OFS="," '{
  $4 = $4 gensub(/../, ",&", "g", $5)
}NF--' file

awk를 사용하세요

awk '
  BEGIN { OFS = FS = "," }
  gsub(/../, FS "&", $5) {
    print $1, $2, $3, $4 $5
  }
' file

확장 모드를 갖춘 GNU sed

sed -Ee '
  s/,/\n/4;ta
  :a
    s/\n,/,/;t
    s/..(,..)*$/,&/
  ta
' file

Perl에서는 5번째 필드를 한 번에 두 문자씩 압축 해제합니다.

perl -F, -lape '$_ = join ",", @F[0..3], unpack "(A2)*", $F[4]' file 

Perl을 사용하는 또 다른 방법

perl -F, -lane 'print reverse pop(@F) =~ s/(..)/,$1/gr, join ",", @F' file
perl -lpe 's/^.*[^,]\K,(.*)/$1 =~ s|(..)|,$1|gr/e' file

rhs에서 posix sed(\n)를 사용하는 것은 상징적입니다. 이스케이프된 줄바꿈으로 교체)

sed -e '
  s/,/\n/4;h;s/\n.*//;x
  s/.*\n//;s/../,&/g;H;x
  s/\n//
' file

관련 정보