特定の列の単語の文字数を取得するにはどうすればよいですか?


12

次のようなCSVファイルがあります。

abd,123,egypt,78
cde,456,england,45

3列目の単語のみの文字数を取得するにはどうすればよいですか?

wcこれを行う方法がわかりません。

回答:


23
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コマンドを使用して出力を取得できない!」と述べています。
mikeserv

3
@mikeservは、文字数を取得wcすることができなかったためwc、このコンテキストでの使用方法を示す理由であると解釈します。
ステファンシャゼル

ああ....それはある非常に私に起こったことはありません、すべての有効な解釈は...
mikeserv

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
アーメン; awk列ベースのファイルを1行ずつ処理するために設計されました。この問題はツールに最適です。
レイ

{print + sum}の+の目的は何ですか?{print sum}も同様に機能します。
スパーダー

3
@spuder、0入力ファイルが空の場合、空行の代わりに印刷します。
ステファンシャゼル

2
一方、@ Rayは、awk典型的なUnixの精神で3つの基本的なユーティリティ(それぞれがの数分の1のサイズ)をケースに協力させる(同時に動作する)ことで、タスクを達成できます。cut + tr + wcが、このawk自体の5倍の速さであることに気付くかもしれませんperl。(少なくとも私のシステムでは、UTF8ロケールで、100MBのファイルで試しました)。
ステファンシャゼル

5

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

文字カウントではなく、バイトカウントを返すことに注意してください。
ステファンシャゼル

@StephaneChazelas:length()は、perldocによる物理バイトではなく、論理文字数を返します。
クオンルム

しかし、あなたが必要とする-Mopen=:localeためperl、文字が何であるかのユーザー/システムの定義を使用し、それ以外の場合は、文字がバイトであると仮定し、。a,1,españa,2UTF-8ロケール(ほとんどのシステムのデフォルト)で入力を試してください。
ステファンシャゼル

@StephaneChazelas:ああ、私の答えを更新しました。良い点をありがとう!
クオンルム




1

サンプルファイルは次のようになります。

$ 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文字数を取得する必要があります。


0

とを使用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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.