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