큰 문자 줄을 동일한 수의 열을 가진 여러 줄로 나누는 방법은 무엇입니까?

큰 문자 줄을 동일한 수의 열을 가진 여러 줄로 나누는 방법은 무엇입니까?

데이터 파일이 다음과 같은 경우:

snp200 snp1 snp100 snp32 1 1 0 2 0 0 0 2 2 2 2 1...

snp..가 완료되면 열 이름으로 사용한 다음 나머지 숫자를 균등하게 나눕니다(각 행의 총 숫자 수는 첫 번째 행의 열 이름 수와 같아야 함). 어떻게 행을 나누고 각 행마다 다음 행에 넣으십시오. 이 작은 예에는 4개의 열 이름이 있으므로 나머지 4개 행에는 4자리 출력이 있어야 합니다.

snp200 snp1 snp100 snp32
1 1 0 2
0 0 0 2
2 2 2 1 
...

실제 데이터가 매우 크다는 점을 고려하면(열 이름이 32000개 이상) 제안 사항이 있으면

답변1

한 가지 옵션은 다음을 사용하는 것입니다.진주 정규식, 이와 같이:

cat in.txt | perl -pe 's/(([^ ]+ +){4})/$1\n/g' > out.txt

정규식은 하나 이상의 공백이 아닌 항목과 하나 이상의 공백을 찾고 처음 2개를 4개의 그룹으로 그룹화한 다음 각 일치 항목 뒤에 새 줄을 추가하는 것을 의미합니다.

테스트 사례:

echo "snp200 snp1 snp100 snp32 1 13454356 0 2 0 0 0 2 2 2 2 1" | perl -pe 's/(([^ ]+ +){4})/$1\n/g'
snp200 snp1 snp100 snp32 
1 13454356 0 2 
0 0 0 2 
2 2 2 1

답변2

BSD 사용 rs(1):

rs 0 4 <data.txt >out.txt

답변3

네 개의 열만 필요한 경우:

$ cat data.file | tr ' ' '\n' | columns -w 10 -c 4

snp200    snp1      snp100    snp32
1         1         0         2
0         0         0         2
2         2         2         1

답변4

명명된 태그의 수가 다를 수 있는 경우 먼저 태그 수를 세는 것이 좋습니다. Perl에서는 다음과 같습니다.

perl -lane '
   $n++ while $F[$n] =~ /^[a-z]/; 
   do { 
     print join(" ", @F[$_*$n .. $_*$n + $n - 1])
   } while (++$_*$n <= $#F)' < input

먼저, $n문자로 시작하는 각 필드가 증가하여 명명된 필드의 수를 제공한 다음, 카운터가 총 필드 수보다 작은 한 공백, 필드가 0*$n에 결합된 1*$n - 1다음 에 1*$n결합되는 2*$n - 1식으로 인쇄가 반복됩니다. $n테이블의 필드입니다. 철사. 이는 모든 데이터가 하나의 행에 있고 후속 행이 별도의 데이터 세트로 처리된다고 가정합니다.

관련 정보