1

グローバル ドメインは "*@" オプションにあります。電子メールがこれらのグローバル ドメインのいずれかと一致する場合、それらをリストから除外する必要があります。

例:

WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@superuser.com
WF,test@stackapps.com
WF,test@stackexchange.com

出力:

WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com
4

6 に答える 6

3

同じファイルに2種類のデータがあるため、処理する最も簡単な方法は、最初にデータを分割することです。

<infile tee >(grep '\*@' > global) >(grep -v '\*@' > addr) > /dev/null

次に、を使用globalして情報を削除しますaddr

grep -vf <(cut -d@ -f2 global) addr

それを一緒に入れて:

<infile tee >(grep '\*@' > global) >(grep -v '\*@' > addr) > /dev/null
cat global <(grep -vf <(cut -d@ -f2 global) addr) > outfile

内容outfile

WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com

で一時ファイルをクリーンアップしますrm global addr

于 2012-10-29T10:59:57.107 に答える
2

あなたがすることができます:

grep -o "\*@.*" file.txt | sed -e 's/^/[^*]/' > global.txt
grep -vf global.txt file.txt

これは、グローバルな電子メールを抽出することから始まり、先頭に を追加して[^*]、結果を に保存しますglobal.txt。このファイルは、grep への入力として使用されます。各行は、形式の正規表現として扱われ[^*]*@global.domain.comます。この-vオプションは、そのパターンに一致しない行のみを出力するように grep に指示します。

インプレース編集に sed を使用する別の類似のオプションは次のとおりです。

grep -o "\*@.*" file.txt | sed -e 's/^.*$/\/[^*]&\/d/' > global.sed
sed -i -f global.sed file.txt
于 2012-10-29T10:40:34.920 に答える
2
$ awk -F, 'NR==FNR && /\*@/{a[substr($2,3)]=1;print;next}NR!=FNR && $2 !~ /^\*/{x=$2;sub(/.*@/,"",x); if (!(x in a))print;}' OFS=, file file
WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com
于 2012-10-29T10:50:03.113 に答える
2

を使用する 1 つの方法を次に示しGNU awkます。次のように実行します。

awk -f script.awk file.txt{,}

の内容script.awk:

BEGIN {
    FS=","
}

FNR==NR {
    if (substr($NF,1,1) == "*") {
        array[substr($NF,2)]++
    }
    next
}

substr($NF,1,1) == "*" || !(substr($NF,index($NF,"@")) in array)

結果:

WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com

または、ここにワンライナーがあります:

awk -F, 'FNR==NR { if (substr($NF,1,1) == "*") array[substr($NF,2)]++; next } substr($NF,1,1) == "*" || !(substr($NF,index($NF,"@")) in array)' file.txt{,}
于 2012-10-29T11:18:09.197 に答える
1

これはうまくいくかもしれません(GNU sed):

sed '/.*\*\(@.*\)/!d;s||/[^*]\1/d|' file | sed -f - file
于 2012-10-29T13:27:51.890 に答える
0

ファイルの 1 つのパスで、グローバル ドメインをアドレスと混在させることができます。

$ cat file
WF,*@stackoverflow.com
WF,test@superuser.com
WF,*@superuser.com
WF,test@stackapps.com
WF,test@stackexchange.com
WF,*@stackexchange.com
WF,foo@stackapps.com
$
$ awk -F'[,@]' '
   $2=="*" { glbl[$3]; print; next }
   { addrs[$3] = addrs[$3] $0 ORS }
   END {
      for (dom in addrs)
         if (!(dom in glbl))
            printf "%s",addrs[dom]
   }
' file
WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com
WF,foo@stackapps.com

または、2 パスのアプローチを気にしない場合:

$ awk -F'[,@]' '(NR==FNR && $2=="*" && !glbl[$3]++) || (NR!=FNR && !($3 in glbl))' file file
WF,*@stackoverflow.com
WF,*@superuser.com
WF,*@stackexchange.com
WF,test@stackapps.com
WF,foo@stackapps.com

2番目のものは少しわかりにくいですが、デフォルトのアクションを使用しないように簡単に変換でき、awkイディオムの良い練習になります:-)。

于 2012-10-29T13:19:34.067 に答える