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
他のルールを追加することもできます。1
1
print
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番目の発生と一致します。