2つのテキストファイルがあります。 1つは、ユーザー名と彼らが働いている会社のリストを同じ行にリストしますが、タブスペースで区切ります。 2番目は、より多くの情報を含む週間生成レポートの出力です。
目標は、毎週のレポートから名前を取得し、それをユーザー名リストの名前と会社に変更することです。
ユーザー名と会社のリストは、タブスペースで区切られたUserList.txtファイルにあります。
Name1 Company 1
Name2 Company 2
Name3 Company 3
Name4 Company 4
Name5 Company 5
毎週の出力ファイルは Weekly.txt ファイルにあります。
最初のテキストファイルを調べて名前と会社名を取得し、2番目のテキストファイルでその部分のみを変更する方法を知りません。
私は次のような最終出力を探しています。
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 xlsx2csv
。
join
パッケージの一部です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
。