텍스트 파일의 값을 빠르게 비교

텍스트 파일의 값을 빠르게 비교

2개의 열이 있는 텍스트 파일이 있는데 첫 번째 열은 이름이고 두 번째 열은 시간 값입니다. 좋다:

cat  34M
dog  34M
fish 12M
ant  34M

동일한 값에 대해 두 번째 열을 비교해야 하며 1이 나머지 열과 다른 경우 해당 항목을 표시하고 싶습니다. 따라서 이 경우에는 다른 생선과 다르기 때문에 태그를 붙여야 합니다. 파일은 동적이며 폴더별로 for 루프를 통해 변경되므로 내 스크립트는 for 루프에서 비교를 실행해야 합니다.

for FOLDER in is find ${DIR}/ -maxdepth 1 -type f -name values.txt`; do
<something to flag the 'odd' value>
done

두 번째 열을 먼저 정렬한 다음 첫 번째(가장 높은) 값을 주 표시로 비교해야 한다고 생각합니다. 파일에는 2개 이상의 "홀수" 값이 포함될 수 있습니다. 파일에는 2~500개의 항목이 포함될 수 있습니다. 첨자나 awk로 뭔가를 할 수 있지만 어디서부터 시작해야 할지 모르겠습니다.

도와 주셔서 감사합니다.

답변1

값이 메모리에 맞으면 "최대 500"은 다음과 같아야 하며 원하는 것에 따라awk어쩌면 가능할지도 몰라한 단계에서 그리고 (적어도 대부분) 한 프로세스에서.

한 번 발생하는 모든 값(값이 여러 개인 경우)을 순서에 관계없이 나열합니다.

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual

한 번 발생하는 값을 나열하십시오(적어도 하나 있는 경우).

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'

한 번 발생하고 그렇지 않으면 존재하지 않는 값을 나열하십시오.

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'

답변2

한 가지 방법은 다음과 같습니다.

awk -v std="$( awk '{print $2}' file.txt | \
    sort | \
    uniq -c | \
    sort -rn | \
    awk 'NR==1 {print $2; exit}' )" '$2!=std' file.txt

내부의 긴 명령은 $(...)가장 일반적인 시간 값을 결정하는 반면, 외부 awk명령은 고유한 값을 가진 두 번째 열의 모든 항목을 선택합니다. 스크립트는 등과 같은 가능한 시간 "별명"을 고려하지 않고 1M = 60S단지 12M34M문자열을 처리합니다.

답변3

diff를 사용해 보셨나요? 이 도구는 두 파일의 첫 번째 열이 일치하면 완벽하게 맞습니다. 그렇지 않으면 간단히 두 번째 열을 가져와서 diff와 비교할 수 있습니다. 스크립트에서 diff를 사용할 수도 있습니다.

http://man7.org/linux/man-pages/man1/diff.1.html

관련 정보