2개의 텍스트 파일이 있습니다. 하나는 사용자 이름과 그들이 일하는 회사의 목록을 같은 줄에 나열하지만 탭 공백으로 구분합니다. 두 번째는 더 많은 정보가 포함된 주간 생성 보고서의 출력입니다.
목표는 주간 보고서에서 이름을 가져와 이를 사용자 이름 목록의 이름과 회사로 바꾸는 것입니다.
사용자 이름 및 회사 목록은 탭 공백으로 구분된 UserList.txt 파일에서 다음과 같습니다.
Name1 Company 1
Name2 Company 2
Name3 Company 3
Name4 Company 4
Name5 Company 5
주간 출력 파일은 Weekly.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
.