fields.txt
다음과 같은 줄을 포함하는 파일이 있습니다 L=300k+
.
field1 field2 field3
field1 field2 field3
field1 field2 field3
...
field1 field2 field3
같은 폴더에 와 사이에 이름 이 지정된 N
문자열(식별해 보겠습니다 s(n)
) 만 포함하는 파일이 있습니다 . 하지만 .res-0-n-0
n
0
L
N < 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.txt
res-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
이렇게 하면 대용량 파일에 대해 한 번만 반복하면 됩니다. 이것이 도움이 된다면 알려주세요.