bash에서 두 개의 텍스트 파일을 연결하여 두 열과 일치하는 출력을 얻습니다.

bash에서 두 개의 텍스트 파일을 연결하여 두 열과 일치하는 출력을 얻습니다.

이 두 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.

관련 정보