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
주어진입력하다
cut
, 및 :을sort
사용 하십시오 .uniq
sed
cut -d ' ' -f1,3 Input | sort | uniq -c | sed 's/^ *//;s/^\([0-9]*\) \([^ ]*\)/\2 \1/'
사용
datamash
및sed
: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