0

名前と番号が記載された複数のファイルがあります。

Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246

uniqの最初の列の値ごとに2番目の列を合計したいですか?つまり、ヨランダ606 + 669 + 713 =

Yolanda 1988
Yoselin 965

また、ヨランダが200未満の場合は、すべてのヨランダを削除したいと思いますか?

編集:明確ではないことをお詫びしますが、100万を超えるレコードと数十万の名前があります。Yolandaは、任意の「$1==文字列」に対してこれらの操作を実行できるようにしたい例です。何が起こっているのかがわかるように、2つの別々のawkコマンドの方が適しています。

4

4 に答える 4

1

データがdata.txtにあると仮定します。

awk '$2>200{sum[$1]+=$2} END {for(name in sum){print name,sum[name]}}' data.txt 
于 2013-02-20T06:04:01.990 に答える
1

これはそれを行います:

awk '! ($1 !~ /Yolanda/ && $2 <= 200) { 
        arr[$1] += $2 
     } END { 
        for (i in arr) 
           printf("%s %d\n", i, arr[i]); }' file.txt

サンプル入力で次のように生成されます。

Zaniyah 246
Yuridia 241
Yuliana 500
Yolanda 1988
Yoselin 965

gawk利用可能な場合はasorti、その関数を使用して名前をアルファベット順に戻すことができます。

awk '! ($1 !~ /Yolanda/ && $2 <= 200) {
        arr[$1] += $2
     } END {
        n = asorti(arr, sorted)
        for (i = 1; i <= n; i++)
           printf("%s %d\n", sorted[i], arr[sorted[i]]);  }' file.txt
于 2013-02-20T05:58:39.233 に答える
1

いずれかの値が200未満の場合、これにより合計が削除されます

$ cat infile
Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246
blabla 199
blabla 800

$ awk '{T[$1]+=$2} $2<200{E[$1]} END{for(i in T) if (!(i in E)) print i,T[i]}' infile
Yuridia 241
Yoselin 965
Zaniyah 246
Yolanda 1988
Yuliana 500
于 2013-02-20T14:29:29.097 に答える
0

これは行います:

awk '{if($0~/Yolanda/&&$2<=200){next}a[$1]+=$2;}END{for(i in a) print i,a[i]}' your_file

テスト済み:

> cat temp
Yolanda 199
Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246
> awk '{if($0~/Yolanda/&&$2<=200){next}a[$1]+=$2;}END{for(i in a) print i,a[i]}' temp
Yolanda 1988
Yuliana 500
Zaniyah 246
Yuridia 241
Yoselin 965
> 
于 2013-02-20T12:52:22.483 に答える