한 파일의 사용자 이름을 다른 파일의 출력에서 ​​사용자 이름과 회사로 바꿉니다.

한 파일의 사용자 이름을 다른 파일의 출력에서 ​​사용자 이름과 회사로 바꿉니다.

2개의 텍스트 파일이 있습니다. 하나는 사용자 이름과 그들이 일하는 회사의 목록을 같은 줄에 나열하지만 탭 공백으로 구분합니다. 두 번째는 더 많은 정보가 포함된 주간 생성 보고서의 출력입니다.

목표는 주간 보고서에서 이름을 가져와 이를 사용자 이름 목록의 이름과 회사로 바꾸는 것입니다.

사용자 이름 및 회사 목록은 탭 공백으로 구분된 UserList.txt 파일에서 다음과 같습니다.

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

주간 출력 파일은 Weekly.txt 파일에 있습니다.

테스트.txt

첫 번째 텍스트 파일을 조사하여 이름과 회사 이름을 얻고 두 번째 텍스트 파일에서 해당 부분만 바꾸는 방법을 모르겠습니다.

나는 다음과 같은 최종 출력을 찾고 있습니다.

최종 출력.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. 지정된 순서대로 열을 인쇄합니다 -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

한 가지 해결책은 사용자 파일의 모든 줄을 바꾸는 것입니다. 다음 스크립트는 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.

관련 정보