ファイル内の「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
7番目の列のみが必要な場合は、前に次を追加してください。
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