중복된 마지막 열을 제거하지 않고 계산하는 방법은 무엇입니까?

중복된 마지막 열을 제거하지 않고 계산하는 방법은 무엇입니까?

4개의 열이 있는 파일이 있습니다. 마지막 세 개의 열을 비교하고 행을 삭제하지 않고 발생 횟수를 계산하고 싶습니다. 각 줄 앞에 숫자가 나타나기를 원합니다.

내 파일은 다음과 같습니다.

ID-jacob  4.0  6.0  42.0  
ID-elsa   5.0  8.0  45.0  
ID-fred   4.0  6.0  42.0  
ID-gerard 6.0  8.0  20.0  
ID-trudy  5.0  8.0  45.0  
ID-tessa  4.0  6.0  42.0

내가 원하는 결과는 다음과 같습니다.

3 ID-jacob  4.0  6.0  42.0  
2 ID-elsa   5.0  8.0  45.0  
3 ID-fred   4.0  6.0  42.0  
1 ID-gerard 6.0  8.0  20.0  
2 ID-trudy  5.0  8.0  45.0  
3 ID-tessa  4.0  6.0  42.0

sort 및 uniq를 사용해 보았지만 각 중복 행의 첫 번째 행만 제공됩니다.

cat file | sort -k2,4 | uniq -c -f1 > outputfile

답변1

큰 파일을 메모리에 저장하는 데 문제가 있을 수 있습니다. 정렬이 완료된 후 줄을 순서대로 배치하는 힘든 작업을 수행한 후 일치하는 줄만 저장하기 때문에 이것이 약간 더 좋습니다.

# Input must be sorted first, then we only need to keep matching lines in memory
# Once we reach a non-matching line we print the lines in memory, prefixed by count
# with awk, variables are unset to begin with so, we can get away without explicitly initializing
{ # S2, S3, S4 are saved field values
  if($2 == S2 && $3 == S3 && $4 == S4) {
    # if fields 2,3,4 are same as last, save line in array, increment count
    line[count++] = $0;
  } else {
    # new line with fields 2, 3, 4 different
    # print stored lines, prefixed by the count
    for(i in line) {
      print count, line[i];
    }
    # reset counter and array
    count=0;
    delete line;
    # save this line in array, increment count
    line[count++] = $0;
  }

  # store field values to compare with next line read
  S2 = $2; S3 = $3; S4 = $4;
}
END{ # on EOF we still have saved lines in array, print last lines
    for(i in line) {
      print count, line[i];
    }
}  

스크립트는 일반적으로 awk파일에 저장됩니다.
다음과 같이 사용할 수 있습니다.
sort -k2,4 file | awk -f script

3 ID-fred   4.0  6.0  42.0  
3 ID-jacob  4.0  6.0  42.0  
3 ID-tessa  4.0  6.0  42.0
2 ID-elsa   5.0  8.0  45.0  
2 ID-trudy  5.0  8.0  45.0  
1 ID-gerard 6.0  8.0  20.0  

답변2

도움이 될 수 있습니다:

awk '{ pop[$1] = $2" "$3" "$4; x[$2" "$3" "$4]++; } END { for (name in pop) { if (pop[name] in x) { print x[pop[name]], name, pop[name]; } } }' file

pop과 x라는 두 개의 배열을 생성합니다. pop에는 column1 및 value=colum2" "column3" "column4의 키가 있고 배열 x에는 배열 pop 및 count 중복의 키와 값이 있습니다. 마지막 루프에서는 배열 x의 배열 팝 값에서 각 이름을 확인합니다.
귀하의 주문을 보류하지 않습니다.

관련 정보