두 개의 열과 3,00,000개가 넘는 행이 포함된 텍스트 파일이 있습니다. 형식은 다음과 같습니다
Filename1.txt Num1
Filename2.txt Num2
Filename3.txt Num3
Numx
50보다 크고 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
질문에 태그가 지정되었습니다.sed그리고grep, 그래서 누군가가 정규식을 사용한 답변에 관심이 있다고 가정합니다. 또한 입력 데이터 파일이 크다는 질문이 있으므로 성능을 고려한다고 가정합니다.
또한 입력 파일에 한 줄에 하나의 파일 이름이 포함되어 있다고 가정하면 줄 바꿈을 포함하는 (아픈) 파일 이름은 없을 것입니다.
다른 답변은 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
위의 내용은 sed
GNU 버전을 가정한 것입니다 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
각 빌드는 여러 파일을 복사합니다. 효율적인 활용을 위해 xargs
각 cp
명령줄을 채우려고 시도합니다. 이는 입력 데이터가 클 때 다른 답변에 비해 상당한 성능 향상을 제공해야 합니다.