この質問を参照してください: テキストファイルから欠落している値を見つける
次のデータを含むファイルが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