열 1과 유사한 열 2의 항목 수를 계산합니다.

열 1과 유사한 열 2의 항목 수를 계산합니다.

동일한 열 1의 열 2에 있는 항목 수를 계산하려고 하며, 마찬가지로 열 1의 열 2에 있는 첫 번째 항목이 발생하는 횟수를 계산하려고 합니다.

예를 들어 내 입력 TSV 파일은 다음과 같습니다.

C1  NC01
    NC01
C2  NC01
    NC01
    NC02
C3  NC01
    NC02
    NC03

내가 원하는 출력은 다음과 같습니다.

C1  NC01  2  2
    NC01
C2  NC01  3  2
    NC01
    NC02
C3  NC01  3  1
    NC02
    NC03

명령줄을 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

사용 awk:

awk '{a[NR]=$0} {if(NF!=1){y=$2;x=$0;b[x]=1;c[x]=1}else{b[x]++;if(y==$1){c[x]++}}} END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}' file

물론 가장 간단한 것은 아니지만 귀하가 제공한 의견을 바탕으로 제게는 효과가 있었습니다.

설명하다:

  • {a[NR]=$0}: 먼저 파일의 전체 내용을 이름이 지정된 배열로 로드합니다 a.
  • if(NF!=1): 행에 여러 열(두 개 이상의 열)이 있는 경우...
  • {y=$2;x=$0;b[x]=1;c[x]=1}y: ... 계산하려는 두 번째 열 값에 변수를 설정하고 , x전체 행에 변수를 설정합니다. 이러한 변수는 이후 반복에서 사용됩니다. 이 값은 b두 배열의 인덱스 이기도 하며 c카운트 값을 저장하는 위치이기도 합니다.
  • else{b[x]++;if(y==$1){c[x]++}}: 행에 열이 하나만 있으면 b배열의 값이 증가합니다. 또한 해당 열이 에 저장한 기본 행의 두 번째 열과 일치하는 경우 y해당 값을 증가시킵니다 .
  • END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}:마지막으로 배열을 반복 a하고 해당 값을 인쇄합니다(파일 내용의 간단한 덤프임). 또한 b다른 두 배열과 의 개수 값을 인쇄합니다 c.

출력은 다음을 제공합니다.

C1  NC01 2 2
    NC01
C2  NC01 3 2
    NC01
    NC02
C3  NC01 3 1
    NC02
    NC03

관련 정보