다음 데이터가 포함된 텍스트 파일이 있습니다.
Name Feature
Marry Lecturer
Marry Student
Marry Leader
Bob Lecturer
Bob Student
Som Student
나는 각 사람에 대해 단 3가지 특성만을 가지고 있습니다.강사,학생그리고지도자.
위의 예는 하나의 예일 뿐이며 실제 데이터에는 이러한 기능을 가진 사람들이 더 많습니다.
이제 각 기능에 누락된 3가지 기능을 확인할 수 있는 Unix 스크립트를 만들고 싶습니다.
키-값 관계를 설정하면 가능하다는 것을 알지만 제대로 파악하지 못합니다.
저는 bash
SunOS 5.10 i386에서 쉘을 실행하고 있습니다.
답변1
list.txt에 이름 목록이 있으면 다음을 수행할 수 있습니다.
for i in Student Leader Lecturer; do grep -F $i list.txt | cut -d ' ' -f 1 | sort > $i.out ; done
3개의 개별 정렬된 파일에서 이름을 얻으려면 diffuse
(또는 xxdiff
또는 )와 diff3
비교할 수 있습니다.
diffuse *.out
각 태그가 누락된 사람의 이름이 포함된 파일만 갖고 싶다면 먼저 모든 이름이 포함된 파일을 생성한 다음 이를 사용하여 uniq -u
해당 목록에 없는 사람(정말 독특한 사람)을 찾을 수 있습니다.
sed -n '1!p' list.txt | cut -d ' ' -f 1 | sort -u > names.all
for i in Student Leader Lecturer; do fgrep $i list.txt | cut -d ' ' -f 1 | cat - names.all | sort | uniq -u > $i.missing ; done
스크립트와 파일을 통해 이 작업을 수행하려면 다음을 수행하십시오 feature
.
Leader
Student
Lecturer
소스 테이블은 다음을 example.txt
사용할 수 있습니다.
#!/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
답변2
배열을 사용하여 순수 bash에서 이 작업을 수행할 수 있습니다.
#!/usr/bin/env bash
## Declare the various arrays we will be using
declare -A hasfeat;
declare -A names;
declare -A features;
## The input file
file="/path/to/file"
## The awk is used to skip the first line, the header
awk 'NR>1' "$file" |
{
while read name feat;
do
## Save the names
names[$name]=1;
## Save the features
features[$feat]=1;
## Save this name/feature combination
hasfeat[$name,$feat]=1;
done
## For each name in the file
for name in ${!names[@]}
do
## For each feature in the file
for feat in ${!features[@]}
do
## Print the name if it doesn't have this feature
[ -z ${array[$name,$feat]} ] && echo $name lacks $feat
done
done;
}
또는 Perl에서 더 간결하게 설명하면 다음과 같습니다.
$ perl -lane 'if($.>1){$l{$F[1]}++;$k{$F[0]}{$F[1]}++}
END{foreach $f (keys(%l)){
map{print "$_ lacks $f" unless $k{$_}{$f}}keys(%k)
}}' file