텍스트 파일이 있습니다(예:).
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