.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()
put
splitnv()
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 |
+--------------+---------------------------------+-----------+--------------------------------+-------------------+----------+-------------+----------------------+