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