텍스트 파일에서 누락된 값 찾기

텍스트 파일에서 누락된 값 찾기

다음 데이터가 포함된 텍스트 파일이 있습니다.

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

나는 각 사람에 대해 단 3가지 특성만을 가지고 있습니다.강사,학생그리고지도자.

위의 예는 하나의 예일 뿐이며 실제 데이터에는 이러한 기능을 가진 사람들이 더 많습니다.

이제 각 기능에 누락된 3가지 기능을 확인할 수 있는 Unix 스크립트를 만들고 싶습니다.

키-값 관계를 설정하면 가능하다는 것을 알지만 제대로 파악하지 못합니다.

저는 bashSunOS 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

관련 정보