텍스트 파일의 누락된 값 일치

텍스트 파일의 누락된 값 일치

이 질문을 참조하십시오: 텍스트 파일에서 누락된 값 찾기

다음 데이터가 포함된 파일이 2개 있습니다.

Name             Feature
Marry            Lecturer
Marry            Student
Marry            Leader
Bob              Lecturer
Bob              Student
Som              Student

특징

 Lecturer
 Student
 Leader 

아래 코드를 따라 샘플 파일의 이름에 누락된 함수를 찾았습니다.

#!/bin/bash
rm -f *.missing names.all
feature=feature
sed -n '1!p' example.txt | cut -d ' ' -f 1 | sort -u > names.all
for i in $(cat $feature)
do
  fgrep $i example.txt | cut -d ' ' -f 1 | cat - names.all | sort | uniq -u >  $i.missing 
done 

이 코드는 이 기능이 없는 이름을 모두 포함하고 있는 Lecturer.missing, Student.missing 및 Leader.missing과 같은 3개의 파일을 제공합니다.

하지만 데이터가 동일한 파일에 있기를 원하며 출력은 다음과 같아야 합니다.

다음과 같은 출력이 필요합니다.

Lecturer   Student   Leader
  Som                 bob
                      Som

동일한 파일에 데이터를 추가하려고 시도했지만 작동하지 않습니다.

답변1

이 코드

awk '
  NR == FNR {feature[$1]=1; next} 
  $1 != "Name" {name[$1]=1; role[$1,$2]=1} 
  END {
    for (f in feature)
      printf "%-12s", f
    print ""
    for (n in name) { 
      for (f in feature) 
        printf "%-12s", (n SUBSEP f in role ? " " : n)
      print ""
    }
  }
' features roles 

이 출력을 제공합니다

Lecturer    Student     Leader      

                        Bob         
Som                     Som         

충분히 가깝나요?

답변2

본문의 모든 의견

awk '
  # make array with FEATURE elements from file "feature"
  FNR==NR{f[$1]=1;next}
  # collect to array all FEATUREs NAME by NAME
  FNR>1{e[$1]=e[$1]" "$2}
  # loop for each element in FEATURE array
  END{for (i in f) {
        # produce a head row with FEATURE elements
        r[0]=r[0] i" "
        # starts row counts for each FEATURE elements
        c=0
        # call all NAMEs 
        for (n in e)
          # check if the FEATURE do not exist for the NAME  
          if(e[n] !~ i){
            # produce next row number 
            ++c
            # construct apropriate row
            if(c in r)
              # if row exist add value to it
              r[c]=r[c] " " n
            else
              # if not exist put apropriate spaces before value
              r[c]=s n
            # find maximum row number between all FEATUREs
            if(c>l)
              l=c
          }
        # make shift in row for next FEATURE  
        s=s" "
      }
      # prints row by row
      for (k=0;k<=l;k++)
        print r[k]
  }' feature example | column -tn

관련 정보