열의 값을 기반으로 한 하위 집합 파일 내용

열의 값을 기반으로 한 하위 집합 파일 내용

텍스트 파일이 있습니다(예:).

apple   V$NFY_Q6_rc V=0.741
apple   V$HOXA7_01_rc   V=0.454
apple   V$ALPHACP1_01_rc    V=0.695
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q2_01 V=0.677
grapes  V$SP1_Q6_01_rc  V=0.685
grapes  V$SP1_Q6_rc V=0.884

각 과일에 대해 V 값이 가장 높은 행(열 3)을 추출하고 싶습니다. 내 출력은 다음과 같아야 합니다.

apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q6_rc V=0.884

다른 하위 디렉터리에 이와 같은 파일이 여러 개 있습니다.

하위 집합을 만든 후 다음 코드를 사용하여 열 2에서 특정 문자열의 발생 횟수를 가져옵니다.

        perl -lanE '$str=$F[1];  $f="/home/$str/list/$str.txt"; $c=`grep -c "$str" "$f"`;chomp($c);$x=0;$x++ if $c;say "$str\t$x\t$c"' file2

그러면 다음과 같은 출력이 생성됩니다. 파일의 열 2에서 문자열 "SP4"를 검색한다고 가정해 보겠습니다.

         X       X in file?  number of times it occurs
        NFA            0                            0
        SP4            1                            2
        NFATC1         0                            0

V 값을 원합니다(위 값은 이 표에 포함되어 있습니다)

          X       X in file?  number of times it occurs      V value
        NFA            0                            0
        SP4            1                            2         0.747
        NFATC1         0                            0

추신: 개입하는 Perl 프로그램에 대한 자세한 내용은 다음 링크를 참조하십시오.

         http://stackoverflow.com/questions/23109490/search-for-occurrence-of-a-string-in-another-file-in-a-particular-column

답변1

순서가 중요하지 않으면 두 번 통과 sort하면 됩니다. 첫 번째 단계에서는 필드 1을 기준으로 정렬한 다음 필드 3의 숫자 부분(위치 4에서 시작)을 기준으로 역순으로 정렬합니다. 이 -b수정자는 선행 공백이 무시되도록 합니다. 이 파이프를 두 번째 파이프에 전달하여 sort필드 1의 각 고유 값에 대해 하나의 레코드를 반환합니다. 그러나 이번에는 안정적인 sort( -s) 수정자를 지정하여 필드 3(각 값까지 버블링됨)에서 가장 높은 값이 있는 레코드를 보장합니다. 필드 1, 이전 정렬 반환)

sort -k1,1 -k3.4b,3nr file.txt | sort -k1,1 -s -u
apple   V$NFY_Q6_rc V=0.741
grapes  V$SP1_Q6_rc V=0.884
orange  V$SP4_Q5    V=0.747

답변2

그리고 awk:

awk -F'[ =]' '$NF>a[$1]{a[$1]=$NF;b[$1]=$0}END{for (i in b) print b[i]}' filename.txt

이는 첫 번째 열로 인덱싱된 V 값의 배열을 생성하여 수행됩니다. 각 행에 대해 V 값을 해당 인덱스에 있는 배열의 현재 값과 비교하고, 더 큰 경우 배열의 값을 업데이트하고 전체 행을 두 번째 배열에 저장합니다. b. 전체 파일이 처리된 후 b의 모든 내용이 인쇄됩니다.

출력 예:

orange  V$SP4_Q5    V=0.747
apple   V$NFY_Q6_rc V=0.741
grapes  V$SP1_Q6_rc V=0.884

순서가 중요하다면 파이프할 수 있습니다 sort(예: V 번호로 정렬).

awk -F'[ =]' '$NF>a[$1]{a[$1]=$NF;b[$1]=$0}END{for (i in b) print b[i]}' filename.txt | sort -t= -nk2

다음을 제공합니다:

apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q6_rc V=0.884

실제 사례:http://ideone.com/WPvRzh

답변3

해결책은 다음과 같습니다 perl.

$ perl -F'\s+|=' -anle '
    $h{$F[0]} = [$F[-1],$_] if $F[-1] > $h{$F[0]}->[0];
    END {print $h{$_}->[1] for keys %h}' file
grapes  V$SP1_Q6_rc V=0.884
apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747

고쳐 쓰다

두 개의 단일 코드 줄을 실행한 후 두 개의 결과가 있다고 가정합니다.

file1:

apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q6_rc V=0.884

file2:

X       X in file?  number of times it occurs
NFA            0                            0
SP4            1                            2
NFATC1         0                            0

다음을 시도해 볼 수 있습니다.

$ awk -F'[ =]+' 'FNR==NR{a[$2]=$NF;next}
            FNR==1{print $0"\tV value";next}
            {for(i in a){
                if(index(i,$1)){
                    print $0"\t"a[i];
                    next;
                }
            }
            print;
        }' file1 file2
X       X in file?  number of times it occurs   V value
NFA            0                            0
SP4            1                            2   0.747
NFATC1         0                            0

관련 정보