次のようなCSVファイルがあります。
abd,123,egypt,78
cde,456,england,45
3列目の単語のみの文字数を取得するにはどうすればよいですか?
wc
これを行う方法がわかりません。
次のようなCSVファイルがあります。
abd,123,egypt,78
cde,456,england,45
3列目の単語のみの文字数を取得するにはどうすればよいですか?
wc
これを行う方法がわかりません。
回答:
cut -d, -f3 | tr -d '\n' | wc -m
(wc -c
文字ではなくバイトをカウントすることに注意してください:
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6
)
wc
することができなかったためwc
、このコンテキストでの使用方法を示す理由であると解釈します。
awk -F, '{sum+=length($3)}; END {print +sum}' file
awk
列ベースのファイルを1行ずつ処理するために設計されました。この問題はツールに最適です。
0
入力ファイルが空の場合、空行の代わりに印刷します。
awk
典型的なUnixの精神で3つの基本的なユーティリティ(それぞれがの数分の1のサイズ)をケースに協力させる(同時に動作する)ことで、タスクを達成できます。cut + tr + wcが、このawk自体の5倍の速さであることに気付くかもしれませんperl
。(少なくとも私のシステムでは、UTF8ロケールで、100MBのファイルで試しました)。
perl
解決策:
perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file
またはより短いバージョン:
perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file
-Mopen=:locale
ためperl
、文字が何であるかのユーザー/システムの定義を使用し、それ以外の場合は、文字がバイトであると仮定し、。a,1,españa,2
UTF-8ロケール(ほとんどのシステムのデフォルト)で入力を試してください。
サンプルファイルは次のようになります。
$ cat sample.txt
abd,123,egypt,78
cde,456,england,45
$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
tr -d '\n' | wc -m; done
5
7
wc
各行のカウントを取得するために作業するのは難しい場合があります。列3の各文字列に対して個別に呼び出す必要があるため、必要な処理を行うのが少し難しくなります。CSVの各行を調べて、列3を抽出し、それを提示してwc
文字数を取得する必要があります。
とを使用sed
してawk
sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'
例:
$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7
2つのawk
awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'
例:
$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
wc
コマンドを使用して出力を取得できない!」と述べています。