데이터 파일이 다음과 같은 경우:
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
테이블의 필드입니다. 철사. 이는 모든 데이터가 하나의 행에 있고 후속 행이 별도의 데이터 세트로 처리된다고 가정합니다.