フィールドと部分文字列を抽出し、ソートされた行をマージします。

フィールドと部分文字列を抽出し、ソートされた行をマージします。

タブで区切られた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]

スピード:

  1. 列3と4を分離します。
awk -F "\t" '{print $3 "\t\t" $4}' 

これにより、上記の最初のブロックに示された内容が生成されます。

どうやって進めますか?

私はフィールドをgrepする方法だけを知っていますが、フィールドを分離することはあなたが望む出力ラインを得るのにあまり役に立ちません。

私はこれに限定されずawk、(フラグを介して)フィールドを簡単に分離できる私が知っている唯一のツールです-F

ベストアンサー1

awkGNUの使用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]

タイトル行は練習用に予約されています。

おすすめ記事