タブで区切られた5つのフィールドで構成されるファイルがあります(この場合、無関係のフィールドは空白です)。
1 2 URL email 5
https://www.a.com/t [email protected]
https://www.a.com [email protected]
https://www.b.fr [email protected]
https://www.b.fr/s/faq [email protected]
希望の出力:
domain email(s)
a.com [email protected]
b.fr [email protected], [email protected]
スピード:
- 列3と4を分離します。
awk -F "\t" '{print $3 "\t\t" $4}'
これにより、上記の最初のブロックに示された内容が生成されます。
どうやって進めますか?
私はフィールドをgrepする方法だけを知っていますが、フィールドを分離することはあなたが望む出力ラインを得るのにあまり役に立ちません。
私はこれに限定されずawk
、(フラグを介して)フィールドを簡単に分離できる私が知っている唯一のツールです-F
。
ベストアンサー1
awk
GNUの使用datamash
:
awk 'BEGIN{ OFS=FS="\t" }
NR>2{ # skip first two records
split($3, a, "/" ) # split $3 into array a on /
domain=a[3] # 3rd element is the domain name
sub(/^www\./, "", domain) # remove www. prefix
print domain, $4 # print domain and email
}
' file | datamash -g 1 unique 2
このawk
セクションでは、最初の2行をスキップし、すべての履歴のドメインと電子メールを印刷します。これは〜になります
a.com [email protected]
a.com [email protected]
b.fr [email protected]
b.fr [email protected]
その後、出力はdatamash
最初のフィールドにパイプされ、入力をグループ化し、2番目のフィールドの固有値のカンマ区切りリストを印刷します。
出力:
a.com [email protected]
b.fr [email protected],[email protected]
タイトル行は練習用に予約されています。