2014-05-09 2 views
0

대용량 파일에서 특정 행을 제거하여 배열에서 행 번호를 삭제하려고합니다. 파일 크기는 2GB 이상이고 배열 크기도 커질 수 있습니다. for 루프없이이 작업을 수행 할 수 있습니까? 가장 빠른 방법은 무엇입니까? 예 :배열에서 행 번호를 가져 오는 중

input: 
>1 
>2 
>3 
>4 
>5 

declare -a A=(2 3 5); 

output: 
>1 
>4 
+0

배열을 이미 갖고 계십니까? –

+0

파일/배열이 실제로 정렬 되었습니까, 아니면 예제의 인공물입니까? – cnicutar

+0

위의 두 가지 의견은 "행 번호 배열을 어떻게 작성하고 있습니까?" – ooga

답변

1

... 줄 번호를 받고하는 것은에서 삭제하기를 배열.

정확한 내용을 이해하면 입력란에서 A 배열의 행 번호가 삭제됩니다.

당신은 sed을 사용할 수

sed $(printf "%dd;" "${A[@]}") inputfile 

가 현재 위치에서 파일을 수정 -i 옵션을 사용합니다. 배열이 너무 큰 경우

대신 공정 대체를 사용하는 것이 좋습니다 :

sed -f <(printf "%dd;" "${A[@]}") inputfile 
0
당신은이 배열 차이 얻을 grep -vf을 사용할 수 있습니다

:

declare -a O=(1 2 3 4 5) 
declare -a A=(2 3 5) 

B=($(grep -vf <(printf "%s\n" "${A[@]}") <(printf "%s\n" "${O[@]}"))) 

가 OUTPUT :

declare -p B 
declare -a B='([0]="1" [1]="4")' 
printf "%s\n" "${B[@]}" 
1 
4 
+2

lol :) 아마'declare -p B'에서 얻은 출력에 대해 알지 못합니다. 여기에'declare -p B' 명령의 출력이 나와 있습니다. – anubhava

+1

그것은 서사시가 @anubhava 실패했습니다. 불쌍한 애가. –

1

I없는이에 일반 쉘 코드에서와. sed은 파일을 편집/변형하는 도구입니다. 더 - 플라이에 - 배열에서 나오지-을 programm를 작성하고있는-장소 INPUTFILE (-i) 위에서

for line in ${A[@]}; do 
    echo ${line}d 
done| sed -i -f /dev/stdin $INPUTFILE 
0
awk -v n=2,3,5 'BEGIN{split(n,nn,",")} !(NR in nn) {print}' input >output 

을 편집

, 라인의리스트가되게합니다 삭제 된 변수는 n 변수로 제공됩니다. (쉼표로 구분 된 형식으로 표시되지만 다른 형식도 가능합니다.) BEGIN 블록에서이 목록은 nn이라는 awk 배열로 변환됩니다. awk 프로그램의 나머지 부분은 라인 번호가 NR 인 모든 줄을 제외 할 줄의 배열 인 nn에 인쇄하지 않습니다.

awk이 적절하게 해시 된 방식으로 멤버십 테스트를 구현하는 경우, 파이썬이 그 방법을 수행하면 위의 사항이 빠릅니다. 그렇지 않은 경우.

관련 문제