이 두 TXT는 아래와 같이 Bash 스크립트에서 하나로 연결되어야 합니다. 도울 수 있니
학생 TXT 파일
123456 John Doe
345678 John P. Doe
987654 John Public Doe
코스 텍스트 파일
EECS2021 John Doe
EECS2021 John P. Doe
EECS2031 John Doe
EECS4201 John Doe
최종 TXT에는 해당 사람과 그 사람에게 할당된 과정이 포함되어야 합니다. 예를 들어:-
Person courses
John Doe EECS2021 | EECS2031 | EECS4201
John P. Doe EECS2021
John Public Doe NoCourses
이 스크립트를 시도했지만 여전히 출력을 얻을 수 없습니다.
#!/bin/sh
persons=`cat T1.txt`
courses=`cat T2.txt`
echo "$persons"
echo "$courses"
linecountf1=$(wc -l T1.txt | awk '{print $1}')
linecountf2=$(wc -l T2.txt | awk '{print $1}')
i=1
y=1
echo "$persons" | while read line
do
name1=$(cat T1.txt | awk -F" " '{print $2" " $3" " $4" " $5" " $6}' | sed -n '$i p')
while [ $linecountf1 = $linecountf2 ]
do
name2=$(cat T2.txt | awk -F" " '{print $2" " $3" " $4" " $5" " $6}' | sed -n '$y p')
if [ "$name1" = "$name2" ]
then
echo "It matching"
gdc=$(cat T2.txt | awk -F" " '{print $1}' | sed -n '$i p')
fi
done
done
echo "John Doe Registered courses - $gdc"
echo "John P. Doe Registered courses -"
echo "John Public Doe Registered courses -"
감사해요
답변1
출력 순서가 중요하지 않은 경우 다음 awk
프로그램이 작동해야 합니다.
awk 'FNR==NR{sub(/^[^ ]* +/,""); courses[$0]; if (length($0)>max) max=length($0); next}
{course=$1; sub(/^[^ ]* +/,"");
if (courses[$0]) courses[$0]=courses[$0] " | " course; else courses[$0]=course}
END{
printf "%- *s Courses\n",max, "Person";
for (p in courses) {printf "%- *s %s\n",max,p,courses[p] ? courses[p] : "NoCourses"}
}' students.txt courses.txt
입력 예의 경우 GNU에서 다음을 생성합니다 awk
.
Person Courses
John Public Doe NoCourses
John P. Doe EECS2021
John Doe EECS2021 | EECS2031 | EECS4201
설명하다
첫 번째 파일(
FNR
파일별 라인 카운터로 표시되며 전역 라인 카운터와 동일 )을 처리할 때 "index"가 학생 이름이고 값은 비어 있는NR
배열을 채우기만 하면 됩니다 .courses
이를 위해sub()
행에서 학생 ID를 제거하는 기능을 사용하여 학생 이름만 남도록 합니다($0
현재는 학생 이름만 포함함). 학생 이름에는 공백이 얼마든지 포함될 수 있으므로 일반적으로 " 공간 내 "필드 분할"은 이름을 추출하는 데 도움이 되지 않습니다.max
또한 나중에 출력을 예쁘게 만들기 위해 가장 긴 이름 길이를 기록하세요 .두 번째 파일 처리 시 학번(첫 번째 공백으로 구분된 필드)을 임시 변수에 저장
course
하고, 학생 이름만 남도록 행에서 다시 삭제합니다. 그런 다음 배열에서 학생 이름을 찾고courses
, 연관된 값이 이미 존재하는 경우(즉,courses[$0]
비어 있지 않은 경우) 기존 값에 코스 이름을 로 구분하여 추가합니다|
. 그렇지 않으면 값을 현재 코스 이름으로 설정합니다.두 파일(조건
END
)을 처리한 후 가장 긴 학생 이름을 수용하도록 형식화된 열 헤더를 인쇄한 다음 학생 강좌 배열을 반복하고 각 항목에 대한 학생 이름 및 관련 강좌를 인쇄합니다(for (p in courses)
모든 "배열 인덱스" = in에서 반복함을 의미). 학생 이름의 경우courses
, 출력 순서를 보장할 수 없는 부분입니다. 버전에 따라 다릅니다awk
.