결과를 수집하기 위해 많은 수의 파일(300,000개 이상)을 처리하는 보다 효율적인 방법은 무엇입니까?

결과를 수집하기 위해 많은 수의 파일(300,000개 이상)을 처리하는 보다 효율적인 방법은 무엇입니까?

fields.txt다음과 같은 줄을 포함하는 파일이 있습니다 L=300k+.

field1 field2 field3
field1 field2 field3
field1 field2 field3
... 
field1 field2 field3

같은 폴더에 와 사이에 이름 이 지정된 N문자열(식별해 보겠습니다 s(n)) 만 포함하는 파일이 있습니다 . 하지만 .res-0-n-0n0LN < L

res_numbers_sorted.tmp명령을 사용하여 위의 숫자로 정렬된 목록이 포함된 파일을 생성했습니다. n(가장 효율적인지는 확실하지 않지만 상당히 빠르며 다른 목적으로 정렬해야 합니다.)

find -maxdepth 1 -type f -name "res-0-*" | sort -t'-' -k3 -n | awk -F'-' '{print $3}'>| res_numbers_sorted.tmp

파일은 res_numbers_sorted.tmp다음과 같습니다.

0
1
8
... 
299963

결국 내가 원하는 것은 다음과 results.txt같은 파일 이름입니다.

field1 field2 field3 s(0)
field1 field2 field3 s(1)
field1 field2 field3
...
field1 field2 field3 s(299963) 
...
field1 field2 field3

이는 s(n)n번째 문자열에 포함된 문자열입니다 res-0-n-0.

cp fields.txt resutls.txt나는 먼저 다음 루프를 통해 내가 원하는 것을 달성했습니다 while.

while IFS='' read -r line; do 
     #storing the content of the file in a variable
     res=$(<res-0-"$line"-0)     
     # this is needed in order to take into account that sed addresses the first line of a file with the number 1 whereas the file list starts with 0
     real_line=$(( line + 1 ))     
     sed -i "${real_line}s/.$/ ${res}/" field.txt
done < res_numbers_sorted.tmp

하지만 속도가 매우 느리기 때문에 여러 번 실행해야 합니다. 나는 이것이 sed작업에 적합한 도구가 아닐 수도 있다고 생각합니다.

답변1

내가 올바르게 이해했다면 fields.txt줄이 많은 파일이 있습니다. 파일이 여러 개 있습니다 res-0-n-0. 그리고 각 줄에 대해 파일 내용 fields.txt에 복사합니다 (존재하는 경우) .results.txtres-0-<line_number>

나는 단순히 fields.txt파일을 한 줄씩 읽고 results.txt필요에 따라 파일 내용의 줄을 에코할 수 있다고 생각합니다.res-0-<line_number>

나는 다음과 같은 것을 선택할 것입니다 :

#! /bin/sh

LINE_NUMBER=0
while read line;
do
  if [ -f "res-0-$LINE_NUMBER-0" ]
  then
    echo "$line $(cat res-0-$LINE_NUMBER-0)" >> result.txt
  else
    echo "$line" >> result.txt
  fi
  ((LINE_NUMBER++))
done < fields.txt

답변2

sed 스크립트를 생성한 후 파일에 한 번만 적용해 보세요 field.txt.

while IFS='' read -r line; do
    res=$(<res-0-"$line"-0)
    real_line=$(( line + 1 ))
    prinft "%s" "${real_line}s/.$/ ${res}/" >> myscript.sed
done < res_numbers_sorted.tmp

그런 다음 다음을 수행하십시오.

sed -i -f myscript.sed field.txt

이렇게 하면 대용량 파일에 대해 한 번만 반복하면 됩니다. 이것이 도움이 된다면 알려주세요.

관련 정보