
다음과 같은 파일이 있습니다.
1
2 4 5 6
20
22
24 26 27
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300
4행과 1열, 3행과 4열, 1행과 3열, 1행과 9열을 표시하는 출력을 원합니다. 따라서 출력은 다음과 같아야 합니다: row(column)
4 (1)
1 (3)
3 (4)
1 (9)
내 실제 데이터가 상당히 크다는 점을 고려하면 어떤 제안이 있습니까? 동시에 마지막 행(여기서는 9개)에 최대 열 수를 표시하고 출력의 첫 번째 행에 최소 열 수를 표시하려고 합니다.
답변1
최신(>4.0) 버전의 GNU awk를 사용하는 경우:
gawk '
{a[NF]++}
END {
PROCINFO["sorted_in"]="@ind_num_asc";
for (i in a) printf "%d (%d)\n", a[i], i;
}' file
4 (1)
1 (3)
3 (4)
1 (9)
답변2
멍하니방법( asorti
기능 사용):
awk '{a[NF]++}END{ asorti(a,b); for(i in b) printf("%d (%d)\n",a[b[i]],b[i]) }' file
산출:
4 (1)
1 (3)
3 (4)
1 (9)
asorti(a,b)
- 인덱스별로 배열 정렬
답변3
원하는 결과를 생성하기 위해 테이블의 각 셀을 자리 표시자로 처리하는 경우 중복 행을 정렬하고 계산하여 동일한 수의 열이 있는 행 수를 확인할 수 있습니다.
a=$(sed 's/\([0-9]\+\)/1/g' file | sort | uniq -c)
dups=$( echo "$a" | cut -d' ' -f7 )
그런 다음 각 행의 단어 수를 계산하여 해당 행에 몇 개의 열이 있는지 확인할 수 있습니다.
words=$(echo "$a" | cut -d' ' -f8- | awk '{print NF}')
paste <(echo "$dups") <(echo "$words")
4 1
1 3
3 4
1 9
답변4
가장 간단한 버전은
cat data.txt | awk '{counts[NF] += 1} END { for (row_count in counts) { printf "%d (%d)\n", counts[row_count], row_count; }'
단지 NF
변수를 사용하여 행의 필드 수를 제공하고 사전에서 이와 연관된 관련 값을 업데이트합니다. 그런 다음 스트림 끝에서 사전의 모든 키를 반복하고 요청된 형식으로 인쇄합니다.