데이터 구조

데이터 구조

File1은 다음과 같습니다(대사 경로: 유전자):

A:1
A:2
A:3
B:a
B:b
C:pp
D:rr

다음과 같이 출력 파일(File1.new라는 이름)을 얻으려면 어떻게 해야 합니까?

A:1, 2, 3
B:a, b
C:pp
D:rr

저는 리눅스 초보자입니다. 간단하게 설명해주셔서 더 좋았어요!

답변1

이것이 awk의 일이다.

awk -F: '{L[$1]=L[$1] "," $2} 
    END { for (l in L) printf "%s:%s\n",l,substr(L[l],2);}'

어디

  • -F::구분자 로 사용
  • {L[$1]=L[$1] "," $2}필드 1로 인덱싱된 쉼표로 구분된 값을 저장합니다.
  • END파일 끝에서
  • for (l in L) 값을 통해 루프
  • printf "%s:%s\n",l,substr(L[l],2);인쇄, 첫 번째 쉼표 건너뛰기
  • ","또는 ", "최종 하위 문자열을 적절하게 조정하는 데 사용할 수 있습니다 .

awk는 다음을 사용하여 한 줄로 작성할 수 있습니다.

awk -F: '....' File1 > File3

유전자 수를 계산하려면 var tou count(여기서는 G)를 추가하면 됩니다.

{L[$1]=L[$1] "," $2;G[$1]++} 
END { for (l in L) printf "%s:%s:%d\n",l,substr(L[l],2),G[l];}

답변2

그리고GNU 데이터 혼합

datamash -t: groupby 1 collapse 2 < file
A:1,2,3
B:a,b
C:pp
D:rr

당신도 계산하고 싶다면,

datamash -t: groupby 1 collapse 2 count 2 < file
A:1,2,3:3
B:a,b:2
C:pp:1
D:rr:1

countunique고유한 필드 수를 원할 경우에도 가능합니다.

답변3

데이터 구조

 %h = (
     ...
      B => [a, b],
      A => [1, 2, 3],
     ...
 );


perl -F':' -lane '
   push @{$h{$F[0]}}, $F[1]}{
   $"=",";
   print "$_:", "@{$h{$_}}|", scalar @{$h{$_}} for keys %h;
' File1 > File1.new

간단히

The field separator is set to a semicolon, thus populating each time a line is read in afresh 
the @F array. Then we append the 2nd field, $F[1], to the array of hash
keyed in on the 1st field, $F[0]. At the end, we display the key name,
followed by the array contents corresponding to this key, & the count of
the array as well.

산출

A:1,2,3|3
B:a,b|2
C:pp|1
D:rr|1

sed -e '
  :loop
     $!N
     s/^\(\([^:]*\):.*\)\n\2:\(.*\)/\1,\3/
   tloop
   P;D
' yourfile

관련 정보