awk は文字列と一致し、列の値を合計します。

awk は文字列と一致し、列の値を合計します。

5つのcsvファイルを含むフォルダ内の単語を一致させようとするために使用するUnited Statesコマンドは、行に単一のエントリがあることを確認します。また、一致する文字列に基づいて他の2つの列を合計したいと思います。

awk -F "," '{if (/United States/) sum_1 += $2;sum_2 += $3} END {print sum_1, sum_2}' Files/*.csv

はい、連続して複数回発生するかどうかを確認しますawk

したがって、米国に関連する行が2回表示される場合は、次のように表示する必要があります。

2
awk '/United States/{x++;}END{print x}' Files/*csv

サンプルファイル

United States,1,2,3
Donald TRump,1,2,3
United States,1,2,3,United States

答え1

awk '/United States/ {i++} END {print i}' RS=",|\n" Files/*.csv

RS- デフォルトでは、改行に設定されているレコード区切り文字を入力します。

答え2

アッ

文字列関数を使用できますグリッド、行ごとの置換回数を返します。これは各行の発生回数を計算する便利な方法であり、すべての行に対してこれを行うことができるため、すべての行の数を計算できます。

awk '{cnt += gsub(/United States/,"&")} END {print cnt}' *.csv

awkスクリプトでこのチェックを使用するには(以下の例のように)、次の構文を使用できます。

awk '{ if (gsub(/pattern/"&")) {"do stuff here"} }' file

または

awk '{x = gsub(/pattern/"&"); "do stuff with x here"; }' file

grep

また、を使用すると、grep出力-oで一致する項目ごとに1行を取得し、出力行数が結果です。

grep -o "United States" *.csv | wc -l

答え3

あなたが提供したサンプル入力ファイルを考えると、@nezabudkaの答えは次のようになります。

awk 'BEGIN {RS=",|\n"} /United States/ {i++} END {print i}' inputFile

そうだね。これにより、次の質問が表示されます。サンプル入力ファイルがすべてのフィールド区切り文字を表すことは確実ですか?それ以外の場合は、次のような入力ファイルの状況を可能にする代替ソリューションがあります。

> cat inputFile
United States,1,2,3
Donald TRump,1,2,3 United States blih blah \!?# bluh  United States
United States,1,2,3,United    States

> awk 'BEGIN {RS=",|\n| "} 
       /United/ {rec=NR; next} 
       /States/ && NR==rec+1 {i++} 
       END {print i}'  inputFile
5

答え4

注文する

    #/bin/bash

    awk '{print gsub("United States",$0)}' filename| awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'

関連情報