3

現状では、タブで区切られたデータを次のように配置しています (わかりやすくするためにヘッダーを追加しています)。

EntryID    GroupID    Result
039848     00100      Description 1  
088345     00200      Description 2
748572     00435      Description 3
884938     00200      Description 2
000392     00200      Description 3
008429     00100      Description 4

私がやろうとしているのは、データをグループに凝縮することです。列 A がグループ ID (重複なし) であり、列 B がそのグループに関連付けられているすべての説明の組み合わせであるテーブルを出力したいと考えています。出力例は次のようになります。

00100      Description 1 | Description 4
00200      Description 2 | Description 2| Description 3
00435      Description 3

グループ ID をパラメーターとして指定して、一度に 1 行を生成する awk コマンドを作成しようとしました。

$ awk -F '\t' '/00100/ { print $2 '\t' $3 }' table.txt > output.txt

これは機能しますが、各ヒットは次のように改行に出力されます

00100    Description 1
00100    Description 2

etc

ORSを代替文字に指定するか、printではなくprintfを使用することでこれを解決できると思いますが、これらのいずれかを試してみると

$ awk -F '\t' 'BEGIN {ORS = '\t'} /00100/ { print $2 '\t' $3 }' table.txt > output.txt
or
$ awk -F '\t' '/00100/ { printf $2 '\t' $3 }' table.txt > output.txt

出力に実際に変更はありません。

それが解決したら、もう 1 つの問題は、これを繰り返すグループが何千もあるということです。データに存在するすべてのグループ ID のリストが別のファイルに保存されています。各 ID の awk へのフィードを自動化したいと考えています。

同様の方法で、ID を grep にフィードするために使用されているコマンドを変更しようとしましたが、ハングするだけなので、それもうまくいきませんでした。

$ for i in `$ cat groupIDs.txt`; do awk -F '\t' '/$i/ { print $2 '\t' $3 }' table.txt' >> test_results.txt ; done;

これらの問題を解決する方法はありますか?

4

4 に答える 4

3

私は awk にはあまり詳しくありませんが、bash、sort、grep、カット アンド ペーストでこれを行うことができます。

#!/bin/bash

groups=$(cut -f2 "$1" | sort -u)
for group in $groups ; do
    echo -n "$group "
    cut -f2- "$1" | grep "^$group" | cut -f2 | paste -d"|" -s -
done

これにより、次の出力が生成されます。

00100   Description 1|Description 4
00200   Description 2|Description 2|Description 3
00435   Description 3

出力区切り文字必要かどうか、" | "またはそうするかどうか"|"はわかりません。

于 2013-09-18T19:03:11.007 に答える
2

次の awk コマンドを試すことができます。

$ awk '{i=$2;$1=""; $2="";a[i]=a[i]?a[i]" |"$0:$0}END{for (i in a) print i, a[i]} ' file
00435   Description 3
00100   Description 1 |  Description 4
00200   Description 2 |  Description 2 |  Description 3

または、ファイルはタブ区切りになっているため、次のように簡略化できます

$  awk -F'\t' '{a[$2]=a[$2]?a[$2]" | "$3:$3}END{for (i in a) print i"\t"a[i]} ' file
00435   Description 3
00100   Description 1 | Description 4
00200   Description 2 | Description 2 | Description 3
于 2013-09-18T18:50:38.890 に答える