특정 수의 열이 있는 행 수 계산

특정 수의 열이 있는 행 수 계산

다음 내용이 포함된 파일이 여러 개 있습니다.

GGHTERR_01218   GGHTERR_02418   GGHTERR_01991
GGHTERR_02211   GGHTERR_02297   GGHTERR_02379
GGHTERR_02294   GGHTERR_02455   GGHTERR_02374
GGHTERR_00532   GGHTERR_00534
GGHTERR_00533   GGHTERR_00535
GGHTERR_00776   GGHTERR_00779
GGHTERR_01220   GGHTERR_01620
GGHTERR_01760   GGHTERR_01761
GGHTERR_01774   GGHTERR_02404
GGHTERR_01889   GGHTERR_01890
GGHTERR_02081   GGHTERR_02287
GGHTERR_02152   GGHTERR_02153
GGHTERR_02260   GGHTERR_02321
GGHTERR_02295   GGHTERR_02375
GGHTERR_02419   GGHTERR_02437
GGHTERR_02420   GGHTERR_02438
GGHTERR_02430   GGHTERR_02448
GGHTERR_00001
GGHTERR_00002
GGHTERR_00003
GGHTERR_00004
GGHTERR_00005
GGHTERR_00006
GGHTERR_00007

3열, 2열, 1열의 행 수를 쉽게 계산하는 방법이 있는지 알고 싶습니다.

따라서 출력은 다음과 같아야 합니다.

3 columns: 3
2 columns: 14
1 colums: 7

답변1

Awk는 이것에 완벽합니다. 공백으로 줄을 나누고(기본적으로 options 로 변경 -F) 내부 변수 NF(필드 수)에는 줄당 필드 수가 있습니다. 따라서 파일을 살펴보고 NF각 줄을 저장하십시오.

awk '{ 
        nums[NF]++
     }
     END{
        for(num in nums){
            printf "%d columns: %d\n", num, nums[num]
        }
     }' file

위의 코드는 단순히 NF필드 수( )를 연관 배열에 저장합니다. nums여기서 키는 필드 수이고 값은 파일에서 열 번호가 발견된 횟수입니다. 마지막으로 배열을 반복하고 인쇄합니다. 위의 예제를 실행하면 다음과 같은 결과가 발생합니다.

$ awk '{ nums[NF]++}END{for(num in nums){printf "%d columns: %d\n", num, nums[num]}}' file
1 columns: 7
2 columns: 14
3 columns: 3

이 접근 방식의 한 가지(사소한) 단점은 파일의 각 줄에 대한 항목을 메모리에 유지해야 한다는 것입니다. 파일이 아주 크거나 사용 가능한 메모리가 거의 없는 경우가 아니면 문제가 되지 않습니다. 하지만 그렇다면 줄당 필드 수를 인쇄한 다음 계산하여 문제를 해결할 수 있습니다.

$ awk '{ print NF}' file | sort | uniq -c
      7 1
     14 2
      3 3

또는 동일한 출력을 얻으려면 다음을 수행하십시오.

$ awk '{ print NF}' file | sort | uniq -c | while read num fields; do printf "%d columns: %d\n" "$num" "$fields"; done
7 columns: 1
14 columns: 2
3 columns: 3

답변2

awk-솔루션, 아마도 약간 번거로울 수 있습니다.

$ a=$(grep '^[GHTER_0-9]\+[[:space:]]\+[GHTER_0-9]\+[[:space:]]\+[GHTER_0-9]\+$' file | wc -l)
$ b=$(grep '^[GHTER_0-9]\+[[:space:]]\+[GHTER_0-9]\+$' file | wc -l)
$ c=$(grep '^[GHTER_0-9]\+$' file | wc -l)
$ printf "3 columns %s\n2 columns %s\n1 column %s\n" $a $b $c
3 columns 3
2 columns 14
1 columns 7

관련 정보