다음과 같은 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