이 질문을 참조하십시오: 텍스트 파일에서 누락된 값 찾기
다음 데이터가 포함된 파일이 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