メールアドレスからドメイン名を抽出してパイプで区切られたファイルの新しい列に追加するにはどうすればよいですか?

メールアドレスからドメイン名を抽出してパイプで区切られたファイルの新しい列に追加するにはどうすればよいですか?

3番目の列には、電子メールアドレスを含むパイプで区切られたファイルがあります。 3番目の列の電子メールアドレスのドメイン名から4番目の列を生成するには、awkまたはsedコマンドを使用するのに役立ちます。

入力ファイル

TEST|1234|[email protected]
TEST|4533|[email protected]
TEST|9030|[email protected]
TEST|0903|[email protected]

期待される出力

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

答え1

この試み、

awk -F '@' '{print $0"|"$NF}' file

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

答え2

使用sed:

$ sed 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

これは@各行の最初の文字と一致し、キャプチャグループを使用してそれ以降のすべてをキャプチャします。一致するテキストはそれ自体で置き換えられ、キャプチャされたテキストは|その間に1文字ずつ置き換えられます。

ファイルがDOSテキストファイルである場合(一部の説明が示すように)、同じコマンドを使用してそれをUnixテキストファイルに変換できます。

$ sed -e 's/[[:cntrl:]]$//' -e 's/@\(.*\)/&|\1/' file
TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

2番目の置換は以前と同じですが、1番目の置換は行の末尾にあるすべての制御文字を削除します(これにより、各行の末尾にキャリッジリターン文字がある場合は削除されます)。ソースファイルがDOSであるかUnixテキストファイルであるかに関係なく、最後のコマンドの出力はUnixテキストドキュメントになります。

答え3

以下のスクリプトを試してください

for i in `cat o.txt`; do y=`echo $i |awk -F "|" '{print $NF}'| awk -F "@" '{print $NF}'`; echo $i | awk -v y="$y"  '{print $0"|"y}'; done

出力

TEST|1234|[email protected]|gmail.com
TEST|4533|[email protected]|yahoo.com
TEST|9030|[email protected]|gmx.com
TEST|0903|[email protected]|gmail.com

関連情報