あるファイルのユーザー名を別のファイルの出力からユーザー名と会社に変更します。

あるファイルのユーザー名を別のファイルの出力からユーザー名と会社に変更します。

2つのテキストファイルがあります。 1つは、ユーザー名と彼らが働いている会社のリストを同じ行にリストしますが、タブスペースで区切ります。 2番目は、より多くの情報を含む週間生成レポートの出力です。

目標は、毎週のレポートから名前を取得し、それをユーザー名リストの名前と会社に変更することです。

ユーザー名と会社のリストは、タブスペースで区切られたUserList.txtファイルにあります。

Name1      Company 1
Name2      Company 2
Name3      Company 3
Name4      Company 4
Name5      Company 5

毎週の出力ファイルは Weekly.txt ファイルにあります。

テスト.txt

最初のテキストファイルを調べて名前と会社名を取得し、2番目のテキストファイルでその部分のみを変更する方法を知りません。

私は次のような最終出力を探しています。

最終出力.txt

sedこれまでは、コマンドを使用して手動でこれを行う方法を見つけました。これが私が今まで持っているものです:

sed -r 's/Name1/Name1 Company 1/g;s/Name2/Name2 Company 2/g;s/Name3/Name3 Company 3/g;s/Name4/Name4 Company 4/g;s/Name5/Name5 Company 5/g'

これはうまくいきますが、他のファイルを読み取って最新の情報を抽出するわけではありません。私はcygwinを使用していますが、これはすべて大きなスクリプトの一部であることに注意してください。

ベストアンサー1

使用joinコマンド:

join -t $'\t' -1 1 -2 2 -o 2.1,1.1,1.2,2.3 \
    user_list.txt \
    <(sed -E 's/^(loginName:)\s+(\S+)\s+(.*)$/\1\t\2\t\3/' test.txt)

join-1 1両方のテーブルは、最初のファイルの列1()と2番目のファイルの列2()を使用して結合されます-2 2。指定された順序で列を印刷します-o

質問の元のバージョンでは、ユーザーのリストはXLSX形式でした。この場合:

join -t $'\t' -1 1 -2 2 -o 2.1,1.1,1.2,2.3 \
    <(xlsx2csv -d tab test.xlsx | tail -n +2) \
    <(sed -E 's/^(loginName:)\s+(\S+)\s+(.*)$/\1\t\2\t\3/' test.txt)

Debian ではxlsx2csvパッケージ ( ) として使用できますapt install xlsx2csvjoinパッケージの一部ですcoreutils

編集する:カンマではなくタブを区切り文字として使用するように調整され、ユーザーのリストがXLSX形式ではなくプレーンテキスト形式で表示されます。

おすすめ記事