일부 열 데이터에 대한 고유 값 및 중복 값 개수를 인쇄하는 가장 간단한 명령

일부 열 데이터에 대한 고유 값 및 중복 값 개수를 인쇄하는 가장 간단한 명령

3개 열, 첫 번째 및 세 번째 열이 있는 샘플 입력 데이터에는 중복 값이 ​​있으므로 중복 횟수와 함께 고유하게 인쇄해야 합니다.

sort -u는 어떤 의미에서는 도움이 되지만 첫 번째 및 세 번째 열과 관련된 중복 값의 발생을 인쇄하지 못합니다.

Input :
3210 -06:00
5172 -06:00
3335 -07:00
3258 -05:00
B3322 -05:00
B5097 -05:00
ㄷ3238 -06:00
ㄷ5364 -05:00
ㄷ 3366 -06:00
ㄷ 3293 -06:00

산출:

A(2)-06:00
A(1)-07:00
일(1)-05:00
B(2)-05:00
중(3)-06:00
중(1)-05:00

또는

산출:

아2 -06:00
아1 -07:00
아1 -05:00
지하2층 -05:00
다3 -06:00
중간 1 -05:00

답변1

정확히 원하는 형식은 아니지만 다른 모든 요구 사항을 충족합니다.

awk '{print $1" "$3}' <inFile> | sort | uniq -c

영어에서는 awk를 사용하여 첫 번째와 세 번째 열만 인쇄한 다음 정렬하고 uniq에 count를 사용합니다.

답변2

$ awk '{ count[$1,$3]++ } END { for (i in count) { split(i, field, SUBSEP); printf("%s(%d)%s%s\n", field[1], count[i], OFS, field[2]) } }' file
A(1) -07:00
B(2) -05:00
A(2) -06:00
A(1) -05:00
C(3) -06:00
C(1) -05:00

출력이 정렬되지 않을 수 있습니다. 필요한 경우 전달하십시오 sort.

이 코드는 입력의 첫 번째 및 세 번째 필드가 배열의 쌍으로 함께 나타나는 횟수를 저장합니다 count(첫 번째 및 세 번째 필드로 인덱싱됨). 마지막으로 배열의 인덱스를 반복하여 원래의 첫 번째 및 세 번째 필드( field[1]및 각각 field[2])로 분할한 다음 원하는 형식의 개수와 함께 출력합니다.


대체 형식:

입력 파일이 필드 구분 기호로 단일 공백을 사용하는 경우(그렇지 않은 경우 다음을 사용함 awk '{ print $1,$3 }')cut

$ cut -d ' ' -f 1,3 file | sort | uniq -c
   1 A -05:00
   2 A -06:00
   1 A -07:00
   2 B -05:00
   1 C -05:00
   3 C -06:00

처음 두 열을 바꾸려면 다음을 수행하십시오.

$ cut -d ' ' -f 1,3 file | sort | uniq -c | awk '{ print $2, $1, $3 }'
A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00

답변3

  1. 주어진입력하다cut, 및 :을 sort사용 하십시오 .uniqsed

    cut -d ' ' -f1,3 Input | 
    sort | uniq -c | 
    sed 's/^ *//;s/^\([0-9]*\) \([^ ]*\)/\2 \1/'
    
  2. 사용 datamashsed:

    datamash -t ' ' -g1,3 -s countunique 2 < Input | 
    sed 's/\(.*\) \(.*\) \(.*\)/\1 \3 \2/'
    

산출:

A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00

관련 정보