-1

特定のパターン (この場合は電子メール アドレス) に基づいてマージする必要がある 2 つのファイルがあります。
可能であれば、grep/sedでこれを行うためにbashしたいと思います。私の弱い脳がそれを処理できるように答えを説明してください。

新しい情報: フィールド マップはありません。ファイルは 2 つの異なるデータ ソースからのものであり、行数が常に同じであるとは限りません。これが現実の世界です。ボブが美術館のメンバーシップの更新を停止すると、ファイル 2 にリストされなくなります。これは、大規模な非営利団体のメンバーシップ ステータスに関する週次レポートの一部です。ファイル 1 は年末まで常に拡大し、ファイル 2 は縮小または拡大する可能性があります。

2 番目のファイルは、常にコンマで区切られるようになりました。ファイル 1 のように、最初のフィールドは常に電子メール アドレスになります。

ファイル 1 には次のような行があります。

007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never

ファイル 2 には、次のような行があります。

User 007@some.org:  Forward To:None  Enabled:false  Action:KEEP

ファイル 2 のコンテンツをファイル 1 に追加して、次のようにフォーマットされたファイル 3 を作成したいと考えています。

007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never,Forward to:None,Enabled:false,Action:KEEP

3 つの新しい列は、常に行末に追加する必要があります。

4

3 に答える 3

1

GNU awk ( for )の新しいリリース ( \sand\Sの代わりに[[:space:]]and ):[^[:space:]]gensub()

$ cat tst2.awk
BEGIN {re="\\S+\\s+([^:]+):\\s+([^:]+:\\S+)\\s+(\\S+)\\s+(\\S+).*"; FS=OFS=","}
NR==FNR {map[gensub(re,"\\1","")] = gensub(re,"\\2,\\3,\\4",""); next}
{print $0, map[$1]}
$
$ cat file1
007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never
$
$ cat file2
User 007@some.org:  Forward To:None  Enabled:false  Action:KEEP
$
$ awk -f tst2.awk file2 file1
007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never,Forward To:None,Enabled:false,Action:KEEP

または最新の awk を使用:

$ cat tst.awk
BEGIN{ FS=OFS="," }
NR==FNR {
    email = $0
    gsub(/^[^[:space:]]+[[:space:]]+|:.*/,"",email)

    sub(/^[^:]+:[[:space:]]*/,"")

    rec = ""
    while ( match($0,/[^:]+:[^:[:space:]]+/) > 0 ) {
        rec = rec (rec ? OFS : "") substr($0,RSTART,RLENGTH)
        $0 = substr($0,RSTART+RLENGTH+1)
        sub(/^[[:space:]]+/,"",$0)
    }

    map[email] = rec
    next
}

{ print $0, map[$1] }
$
$ cat file1
007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never
$
$ cat file2
User 007@some.org:  Forward To:None  Enabled:false  Action:KEEP
$
$ awk -f tst.awk file2 file1
007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never,Forward To:None,Enabled:false,Action:KEEP
于 2013-09-27T20:08:16.630 に答える
1

まず、検索と置換を使用して、必要な形式 (コンマ区切り)で file2 を変更します。ここで私はperlこれを達成するために使用しています。sedも使用できます

perl -pe 's/User\s+(\S+):\s+(.*?:\S+)\s+(.*?:\S+)\s+(.*?\S+)/\1,\2,\3,\4/g' file2 > file2_new

これにより、次のようになります。

$ cat file2_new
007@some.org,Forward To:None,Enabled:false,Action:KEEP

次にjoin、セパレーター,を使用して2つのファイルを結合します

join -t , file1 file2_new

出力:

007@some.org,007,/Members/Inactive/Delete,2013-06-07T04:41:56.000Z,Never,Forward To:None,Enabled:false,Action:KEEP
于 2013-09-27T19:58:48.383 に答える