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