다른 열의 값을 기준으로 열 필터링

다른 열의 값을 기준으로 열 필터링

두 개의 열과 3,00,000개가 넘는 행이 포함된 텍스트 파일이 있습니다. 형식은 다음과 같습니다

Filename1.txt Num1
Filename2.txt Num2
Filename3.txt Num3

Numx50보다 크고 200보다 작은 파일 이름을 모두 다른 파일로 복사하고 싶습니다 .

이 파일 이름을 다른 파일에 복사한 후 이 파일을 모두 다른 폴더에 복사하고 싶습니다.

어떻게 해야 하나요?

답변1

원하는 경우 동시에 비교하고 복사할 수 있습니다 awk.

awk '$2>50 && $2<200 {system("cp -- "$1" /path/to/destination/")}' file.txt

destination파일을 디렉토리 에 복사하려는 경우 필요에 맞게 이 값을 변경하십시오.

  • $2>50 && $2<200필요한 비교를 해보세요

  • 일치하는 것이 있으면 함수에 의해 완료된 cp작업( {system("cp -- "$1" /path/to/destination/")}) 을 수행합니다.system()awk

답변2

이 테스트 파일을 고려해 보겠습니다.

$ cat file
Filename1.txt 49
Filename2.txt 72
Filename3.txt 189
Filename4.txt 203

두 번째 열이 50보다 크거나 같고 200보다 작거나 같은 파일만 선택합니다.

$ awk '$2>=50 && $2<=200 { print $1}' file
Filename2.txt
Filename3.txt

이러한 파일 이름을 특정 경로의 새 파일에 넣으려면 다음을 수행하십시오.

awk '$2>=50 && $2<=200 { print $1}' file >/path/to/newfile

선택한 파일 복사

숫자가 정수라고 가정하고 다음을 시도해 보십시오.

while read fname num; do [ "$num" -ge 50 ] && [ "$num" -le 200 ] && cp -- "$fname" /some/path/ ; done <file

또는 코드를 여러 줄에 걸쳐 분산시키려는 경우:

while read fname num
do
   [ "$num" -ge 50 ] && [ "$num" -le 200 ] && cp -- "$fname" /some/path/
done <file

답변3

질문에 태그가 지정되었습니다.그리고, 그래서 누군가가 정규식을 사용한 답변에 관심이 있다고 가정합니다. 또한 입력 데이터 파일이 크다는 질문이 있으므로 성능을 고려한다고 가정합니다.

또한 입력 파일에 한 줄에 하나의 파일 이름이 포함되어 있다고 가정하면 줄 바꿈을 포함하는 (아픈) 파일 이름은 없을 것입니다.

다른 답변은 cp파일당 프로세스를 효과적으로 생성합니다. 이로 인해 불필요한 성능 저하가 발생할 수 있습니다. 대신 명령줄을 사용하여 원하는 만큼 파일 이름을 xargs호출 할 수 있습니다.cp

sed -rn 's/ (5[1-9]|[6-9].|1..)$//p' input.txt | tr '\n' '\0' | xargs -0 cp -t /destdir

sed닫힌 숫자 범위를 일치시키려면 정규식을 사용하십시오 (50, 200). 수치적 불평등을 해결하기 위해 정규 표현식을 사용하는 것이 항상 가장 멋진 일은 아니지만, 이 경우 필요한 표현식은 매우 간단합니다.

파일 이름에는 개행 문자가 포함되어 있지 않지만 공백과 같은 다른 쓸모 없는 문자가 포함될 수 있다고 가정합니다. xargs구분된 데이터가 주어지면 이는 올바르게 처리되므로 모든 개행 문자를 널 문자로 변환하는 \0데 사용합니다 .tr

위의 내용은 sedGNU 버전을 가정한 것입니다 xargs. BSD 버전(예: OSX)을 사용하는 경우 명령이 약간 다릅니다.

sed -En 's/ (5[1-9]|[6-9].|1..)$//p' input.txt | tr '\n' '\0' | xargs -0 -J {} cp {} /destdir

sed이러한 명령은 , 및 tr의 복사본을 생성합니다 xargs. 여러 빌드가 있지만 cp각 빌드는 여러 파일을 복사합니다. 효율적인 활용을 위해 xargscp명령줄을 채우려고 시도합니다. 이는 입력 데이터가 클 때 다른 답변에 비해 상당한 성능 향상을 제공해야 합니다.

관련 정보