テキストファイルの欠落値の一致

テキストファイルの欠落値の一致

この質問を参照してください: テキストファイルから欠落している値を見つける

次のデータを含むファイルが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

関連情報