파일에서 "a"부터 "z"까지 열의 모든 문자를 어떻게 계산 .tsv
하고 각 문자가 얼마나 자주 나타나는지 출력에서 알 수 있나요?
예를 들어 이것이 열이라고 가정해 보겠습니다.
abc
abd
aabf
내가 원하는 출력은 다음과 같습니다.
4 a
3 b
1 c
1 d
1 f
답변1
그리고 grep
, sort
그리고 uniq
:
$ grep -o '[a-z]' file | sort | uniq -c
4 a
3 b
1 c
1 d
1 f
다음을 사용하여 선행 공백을 제거할 수 있습니다 sed
.
$ grep -o '[a-z]' file | sort | uniq -c | sed 's/^ *//'
4 a
3 b
1 c
1 d
1 f
cut
일곱 번째 열만 필요한 경우 앞에 다음을 추가하세요.
cut -f7 file | grep -o '[a-z]' | sort | uniq -c | sed 's/^ *//'
답변2
만 사용껍데기기본 도구+ csvcut
:
csvcut -c 7 file | tr -d '\n' | fold -w1 | sort | uniq -c
산출
4 a
3 b
1 c
1 d
1 f
답변3
나열된 도구(cut, sed, sort, uniq)를 사용하고 셸을 제외한 다른 도구는 사용하지 마세요.
#!/bin/bash
column=$1
shift
cut -d'\t' -f$column "$@" |
sed 's/[^a-z]//g;s/./&\n/g' |
grep . | sort | uniq -c
이를 사용하여 myprog 7 file1 file2
file1 file2의 열 7을 가져옵니다.
답변4
ㅏ진주단일 라인 구조(파이프라인 없음, 단 하나의 프로세스):
perl -0ane '
map { $h{$_}++ } sort grep { /\w/ } split //, $F[6];
print "$h{$_} $_\n" for sort keys %h
' file
나는 매우 간결하기 때문에 Perl을 좋아합니다.멋진체인 콜 세트.
그 뒤에 있는 아이디어는 HASH( $h
)를 생성하고 각 문자를 반복하여 발생 횟수를 계산하는 것입니다.$h->{$_}++
인쇄 전 해시는 다음과 같습니다.
$VAR1 = {
'a' => 4,
'c' => 1,
'f' => 1,
'd' => 1,
'b' => 3
};
산출
4 a
3 b
1 c
1 d
1 f