1

awkのみを使用して解決しようとしている問題があります。

構造にcsvファイルがあります:

Easting  Northing    Latitude    Longitude   Locality Name

Easting  "Northing"  "Latitude"  "Longitude"     "LocalityName"
364208  176288           51.48441   -2.51685     "Fishponds"
358596  172813           51.45278   -2.59726     "Bristol City Centre"
358886  177828           51.49789   -2.59367     "Southmead"
358839  177839           51.49798   -2.59435     "Southmead"
358980  177882           51.49838   -2.59232     "Southmead"
359009  177863           51.49821   -2.5919          "Southmead"
358839  177529           51.4952        -2.59431     "Southmead"
359475  168262           51.41192   -2.58409     "Hengrove Park"
358945  173526           51.45921   -2.59232     "Bristol"
358943  173525           51.4592    -2.59235     "Bristol"
358941  173524           51.45919   -2.59238     "Bristol"
358940  173523           51.45919   -2.59239     "Bristol"
358945  173528           51.45923   -2.59232     "Bristol"
358936  173520           51.45916   -2.59245     "Bristol"
358936  173521           51.45917   -2.59245     "Bristol"
358932  173516           51.45912   -2.5925          "Bristol"

など... Locality名の各インスタンスをカウントするawkスクリプトを作成しようとしています。これを印刷すると、出力は次のようになります。

Fishponds 1
Bristol City Centre 1
Southmead 5
Hengrove park 1
Bristol 8

これまでのところ、私はこれを持っています:

BEGIN { i = 0; state = 0; names[NR]; FS=","; }

{
#for each element in names array, check if already exists.
    for(j=0;j<=i;j++)
    {
        if(names[j] == $5)
        {
        state = 1;
        break;
        }
    }
# If the name doesnt already exist add to names array
    if(state == 0)
    {
        names[i] = $5;
        i++;
    }
    state = 0;
}

END { 
    for(x=0;x<=i;x++)
    {
    print names[x];
    }
}

うまくいけば、場所を並べ替えて重複を削除しますが、各場所のインスタンスを数えてリストに戻す良い方法はまだ考えられません。

4

4 に答える 4

5

よりシンプルなソリューション:

awk -F '"' 'NR>3 {locname[$2]++}
            END { for (n in locname) {print n, locname[n] } }' INPUTFILE

最初に入力ファイル区切り文字が に設定されて"いるため、2 番目のフィールドは場所の名前になります。最初の行 (ヘッダー) をスキップします。配列 (キーは 2 番目のフィールド) を使用して出現回数をカウントします。最後の行の後に、配列のキーと値を出力します。

于 2012-11-22T14:57:36.457 に答える
1

を使用する 1 つの方法を次に示しGNU awkます。ファイルを 2 回解析しますが、ソートされた出力が得られます。

awk -F "\"" 'NR > 3 && FNR==NR { a[$2]++; next } $2 in a && !b[$2]++ { print $2, a[$2] }' file{,}

結果:

Fishponds 1
Bristol City Centre 1
Southmead 5
Hengrove Park 1
Bristol 8
于 2012-11-22T15:00:15.187 に答える
0

Perlソリューション:

perl -F\" -lane 'if($.>3){$X{$F[1]}++}END{foreach (keys %X){print $_." ".$X{$_}}}' your_file

以下でテスト済み:

> perl -F\" -lane 'if($.>3){$X{$F[1]}++}END{foreach (keys %X){print $_." ".$X{$_}}}' temp
Bristol 8
Hengrove Park 1
Southmead 5
Bristol City Centre 1
Fishponds 1
> 
于 2012-11-23T12:58:14.303 に答える
0

これはあなたのために働くかもしれません:

awk -F\" '/^[0-9]/{if(!location){location=$2};if(location==$2){count++;next};print location,count;location=$2;count=1};END{print location,count}' file

これは、場所がソートされている場合にのみ機能します(例からわかるように)、そうでない場合は次を使用します:

awk -F\" '/^[0-9]/{count[$2]++;if(count[$2]==1)location[++order]=$2};END{for(n=1;n<=order;n++)print location[n],count[location[n]]}' file
于 2012-11-23T06:21:08.893 に答える