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

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

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形式ではなくプレーンテキスト形式で表示されます。

答え2

1つの解決策は、ユーザーファイルのすべての行を置き換えることです。次のスクリプトはWeekly.txtを内部で編集します。

prefix="loginName:\s*"
tail -n+2 UserList.txt | while read line; do
    name=$(printf "$line" | cut -f1)
    company=$(printf "$line" | cut -f2 | tr -d '\n')
    sed -i "s/^\($prefix\)$name/\1$name $company/g" Weekly.txt
done

効率性を高めるために、代替コンテンツを収集し、sed を一度実行できます。

prefix="loginName:\s*"
sedCommand=$(tail -n+2 UserList.txt | while read line; do
    name=$(printf "$line" | cut -f1)
    company=$(printf "$line" | cut -f2 | tr -d '\n')
    printf "s/^\($prefix\)$name/\1$name $company/g;"
done)
sed "$sedCommand" Weekly.txt > new_Weekly.txt

このバージョンはWeekly.txt変更されずに残り、結果が記録されますnew_Weekly.txt

関連情報