여러 파일의 열에서 최소값을 찾아 다른 파일에 인쇄

여러 파일의 열에서 최소값을 찾아 다른 파일에 인쇄

다음과 같은 file1이 있습니다.

25       104.601  0.5 
24.8488  104      0.5 
24.5341  103      0.5 
24.1844  102      0.5 
24.1568  101      0.5 
24.1568  100      0.5 
24.1844  99       0.5 
24.5341  98       0.5 

열 1에서 최소값을 찾아 다른 파일에 인쇄해야 합니다_NEW

이제 다른 파일에 대해 위의 작업을 반복하고 최소 100개 파일의 최소값을 찾아야 합니다..

그래서 나는 file_NEW에 다음과 같은 최종 출력을 갖게 될 것입니다.

24.1568
23.3254 (from file2)
22.312  (from file3)
.....

여기서 file2와 file3에는 file1과 유사한 데이터 세트가 있습니다. 모든 입력 파일은 file*.txt와 같은 동일한 이름 패턴을 가지며 동일한 디렉터리에 있습니다.

awk나 sed로 이 작업을 수행하는 방법을 제안할 수 있는 사람이 있나요?

감사해요

답변1

최소값을 찾으려면 아래 명령을 사용할 수 있습니다.

각 파일에 대해 아래 명령을 사용하십시오.

awk 'NR==1{sum=$1}($1 < sum){sum=$1}END{print sum}'  filename >> outputfile

테스트하고 잘 작동했습니다.

답변2

awk '{print $1 "\t(from " FILENAME ")"}' file* | sort -k1,1n | awk -F'\t' '!seen[$2]++'

위의 내용은 표준 UNIX 도구를 사용하여 모든 입력 파일에 대해 강력하고 효율적으로 작동합니다. 예:

$ cat file1
25       104.601  0.5
24.8488  104      0.5
24.5341  103      0.5
24.1844  102      0.5
24.1568  101      0.5
24.1568  100      0.5
24.1844  99       0.5
24.5341  98       0.5

$ cat file2
75       104.601  0.5
74.8488  104      0.5
74.5341  103      0.5
74.1844  102      0.5
74.1568  101      0.5
74.1568  100      0.5
74.1844  99       0.5
74.5341  98       0.5

$ awk '{print $1 "\t(from " FILENAME ")"}' file{1,2} | sort -k1,1n | awk -F'\t' '!seen[$2]++'
24.1568 (from file1)
74.1568 (from file2)

하지만 파일 이름에 탭이나 개행 문자가 포함되어 있지 않다고 가정합니다. 탭이 포함된 경우 이를 처리하기 위한 간단한 조정이 필요합니다.

awk '{print $1 "\t(from " FILENAME ")"}' file* |
sort -k1,1n |
awk '{f=$0; sub(/[^\t]*\t/,"",f)} !seen[f]++'

\0그러나 개행 문자도 포함되어 있는 경우 (NUL) 종결자를 수용하려면 GNU 도구가 필요합니다 .

awk -v ORS='\0' '{print $1 "\t(from " FILENAME ")"}' file* |
sort -z -k1,1n |
awk -v RS='\0' '{f=$0; sub(/[^\t]*\t/,"",f)} !seen[f]++'

답변3

버전sed

find . -name "file*" -exec sh -c '
   echo $(sort -nk1 "$1"  | sed -n "1{s/ .*//p}" )" (from "${1##*/}")" ' sh {} \; | sort -nk1 > output.txt; cat output.txt

sort필요한 경우 출력 파일을 작성하고 파일 이름을 추가합니다.

답변4

IIUC, 각 파일에 다음을 원합니다.

awk 'NF' FILE | sort -n -k1 - | awk 'NR==1{print $1}' >> file_NEW

awk 'NF' FILE입력 파일에 빈 줄이 있는 경우 이니셜이 필요합니다. 지정된 디렉터리의 모든 파일에 대해 반복적으로 또는 비재귀적으로 이 명령을 실행할지, 아니면 이름에 특정 패턴이 있는 일부 파일에 대해서만 이 명령을 실행할지 지정하지 않았습니다. 어쨌든 다음을 사용하여 find그렇게 할 수 있습니다.

find . -name "FILE*" -exec sh -c 'awk "NF" FILE | sort -n -k1 - | awk "NR==1{print \$1}" >> file_NEW' sh {} \;

이 경우 위의 명령은 이름이 로 시작하는 지정된 디렉터리의 모든 파일에 대해 실행됩니다 FILE.

또한 이것은 찾은 각 파일에 대해 맹목적으로 모든 것을 실행하기 file_NEW때문에 반드시 정렬된 목록을 출력에 제공하지는 않는다는 점에 유의하십시오 .find-exec

관련 정보