동일한 열 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