awkまたはsedを使用してフルネームから名前を取得し、新しい列に抽出します。

awkまたはsedを使用してフルネームから名前を取得し、新しい列に抽出します。

.csv顧客情報を含む多くのファイルがあります。これらすべてのファイルで、FIRSTNAMEこの列の横に追加の列を追加したいと思いますFULLNAME。名前は最初の単語をインポートして生成できますFULLNAME

ジャン・ポールのように、2つの単語の名前はありません。最後の列では、フィールドテキストにカンマが使用されます。

入力する

COMPANY,FULLNAME,EMAIL,FUNCTION,CITY,INDUSTRY,COMMENT
Company name,Firstname Lastname,[email protected],Marketing Manager,New York,Health Care,"home, work"
Company name,Firstname infix Lastname,[email protected],Marketing Manager,New York,Health Care,"home, workhome, work"
Company name,Firstname infix infix2 Lastname,[email protected],Marketing Manager,New York,Health Care,"home, work"

期待される出力

COMPANY,FULLNAME,FIRSTNAME,EMAIL,FUNCTION,CITY,INDUSTRY,COMMENT
Company name,Firstname Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, work"
Company name,Firstname infix Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, work"
Company name,Firstname infix infix2 Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, work"

awk、sed、または他のものを使用してこれをどのように実行できますか?

ベストアンサー1

CSVをサポートするユーティリティの使用ミラー( mlr):

mlr --csv \
    put '$FIRSTNAME = sub($FULLNAME," .*","")' then \
    reorder -f COMPANY,FULLNAME,FIRSTNAME file

...質問にあるデータに基づいて、結果は次のようになります。

COMPANY,FULLNAME,FIRSTNAME,EMAIL,FUNCTION,CITY,INDUSTRY,COMMENT
Company name,Firstname Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, work"
Company name,Firstname infix Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, workhome, work"
Company name,Firstname infix infix2 Lastname,Firstname,[email protected],Marketing Manager,New York,Health Care,"home, work"

Millerのこれらの使用は、フィールドの最初の空白文字の後のすべての項目をFIRSTNAME削除する正規表現ベースの置換を使用して新しいフィールドを作成することから始まります。FULLNAME

COMPANY新しいフィールドは最後にレンダリングされるため、最初のフィールドが、、、FULLNAMEおよびこの順序でなるようにフィールドが並べ替えられます。FIRSTNAME残りのフィールドは元の順序を維持します。

using 式の代わりに with 関数を使用してputフィールド値をスペースに分割し、最初の結果文字列を選択できます。sub()putsplitnv()FIRSTNAME

mlr --csv \
    put '$FIRSTNAME = splitnv($FULLNAME," ")[1]' then \
    reorder -f COMPANY,FULLNAME,FIRSTNAME file

よりきれいな出力のために:

$ mlr --icsv --opprint --barred put '$FIRSTNAME = splitnv($FULLNAME," ")[1]' then reorder -f COMPANY,FULLNAME,FIRSTNAME file
+--------------+---------------------------------+-----------+--------------------------------+-------------------+----------+-------------+----------------------+
| COMPANY      | FULLNAME                        | FIRSTNAME | EMAIL                          | FUNCTION          | CITY     | INDUSTRY    | COMMENT              |
+--------------+---------------------------------+-----------+--------------------------------+-------------------+----------+-------------+----------------------+
| Company name | Firstname Lastname              | Firstname | [email protected] | Marketing Manager | New York | Health Care | home, work           |
| Company name | Firstname infix Lastname        | Firstname | [email protected] | Marketing Manager | New York | Health Care | home, workhome, work |
| Company name | Firstname infix infix2 Lastname | Firstname | [email protected] | Marketing Manager | New York | Health Care | home, work           |
+--------------+---------------------------------+-----------+--------------------------------+-------------------+----------+-------------+----------------------+

おすすめ記事