ファイルから特定のフィールドのEメールアドレスのみを削除する方法は?

ファイルから特定のフィールドのEメールアドレスのみを削除する方法は?

7番目のフィールドのEメールアドレスのみを削除しようとしています。 sedを介してこれを試しましたが、削除したい列を選択/選択することはできません。 7番目のフィールドにあるすべてのメールアドレスを削除したいです。

入力ファイル:

980||||||[email protected]||77880|GB||0CA005D||
7980||||||[email protected]||5656|PO||69B88008BE||
100||||||[email protected]||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||[email protected]||5521123|RSA||B70F2||
080570||||||[email protected]||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
 70||||||RABBIT||AV6777|OI||A005D||

出力:

980||||||||77880|GB||0CA005D||
7980||||||||5656|PO||69B88008BE||
100||||||||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||||5521123|RSA||B70F2||
080570||||||||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
70||||||RABBIT||AV6777|OI||A005D||

これが私が達成しようとしているものですが、達成できないものです。

sed 's/,[a-z][0-9]\@[a-z][0-9]\.[a-z]//' file

答え1

(質問に追加の要件を追加した後、スクリプトを編集しました。)

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file

説明する:

-F '|' -v OFS='|'入力と出力フィールドの区切り記号設定条件付き:列7に含まれる
$7 ~ /@/操作:列@
{ $7 = "" }7を空の文字列に設定
{ print }無条件ジョブ:行印刷

スクリプトは、列7に含まれるすべての項目が@Eメールアドレスであり、そのEメールアドレスに属していない他のデータはないと仮定します。

Valentin Bajramiのコメントで述べたように、そのステートメントを省略し、暗黙のデフォルト動作()を持つ「常にtrue」条件であるのみを含むprint他のルールを追加することもできます。11print

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file

注:質問の(編集された)サンプル出力とは異なり、スクリプトはサンプル入力の最後の行から先行スペースを削除しません。

答え2

この試み。

awk -F\| -vOFS=\| '$7="";1'

答え3

簡略化された電子メール正規表現を使用して、|6番目の項目とオプションの電子メールアドレスを次に置き換えます|(7番目のフィールドの電子メールアドレス以外のアドレスは変更せずに残ります)。

sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
  • s/変える
  • |リテラルと一致|
  • \(グループ開始
  • [^|@]\+1つ以上の非文字|と非@文字と一致します(前のすべての文字@
  • @リテラルと一致@
  • [^|@]\+上記の2行と同じ
  • \.点を合わせる
  • [a-zA-Z]\{2,\}2つ以上の文字の一致
  • \)ターミナルグループ
  • \?0またはグループ一致
  • /|/使用。 。 。交換|
  • 6パターンの6番目の発生と一致します。

関連情報