대용량 파일에서 특정 행을 제거하여 배열에서 행 번호를 삭제하려고합니다. 파일 크기는 2GB 이상이고 배열 크기도 커질 수 있습니다. for 루프없이이 작업을 수행 할 수 있습니까? 가장 빠른 방법은 무엇입니까? 예 :배열에서 행 번호를 가져 오는 중
input:
>1
>2
>3
>4
>5
declare -a A=(2 3 5);
output:
>1
>4
대용량 파일에서 특정 행을 제거하여 배열에서 행 번호를 삭제하려고합니다. 파일 크기는 2GB 이상이고 배열 크기도 커질 수 있습니다. for 루프없이이 작업을 수행 할 수 있습니까? 가장 빠른 방법은 무엇입니까? 예 :배열에서 행 번호를 가져 오는 중
input:
>1
>2
>3
>4
>5
declare -a A=(2 3 5);
output:
>1
>4
... 줄 번호를 받고하는 것은에서 삭제하기를 배열.
정확한 내용을 이해하면 입력란에서 A
배열의 행 번호가 삭제됩니다.
당신은 sed
을 사용할 수
sed $(printf "%dd;" "${A[@]}") inputfile
가 현재 위치에서 파일을 수정 -i
옵션을 사용합니다. 배열이 너무 큰 경우
대신 공정 대체를 사용하는 것이 좋습니다 :
sed -f <(printf "%dd;" "${A[@]}") inputfile
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
lol :) 아마'declare -p B'에서 얻은 출력에 대해 알지 못합니다. 여기에'declare -p B' 명령의 출력이 나와 있습니다. – anubhava
그것은 서사시가 @anubhava 실패했습니다. 불쌍한 애가. –
I없는이에 일반 쉘 코드에서와. sed은 파일을 편집/변형하는 도구입니다. 더 - 플라이에 - 배열에서 나오지-을 programm를 작성하고있는-장소 INPUTFILE (-i) 위에서
for line in ${A[@]}; do
echo ${line}d
done| sed -i -f /dev/stdin $INPUTFILE
awk -v n=2,3,5 'BEGIN{split(n,nn,",")} !(NR in nn) {print}' input >output
을 편집
, 라인의리스트가되게합니다 삭제 된 변수는 n
변수로 제공됩니다. (쉼표로 구분 된 형식으로 표시되지만 다른 형식도 가능합니다.) BEGIN
블록에서이 목록은 nn
이라는 awk
배열로 변환됩니다. awk
프로그램의 나머지 부분은 라인 번호가 NR
인 모든 줄을 제외 할 줄의 배열 인 nn
에 인쇄하지 않습니다.
awk
이 적절하게 해시 된 방식으로 멤버십 테스트를 구현하는 경우, 파이썬이 그 방법을 수행하면 위의 사항이 빠릅니다. 그렇지 않은 경우.
배열을 이미 갖고 계십니까? –
파일/배열이 실제로 정렬 되었습니까, 아니면 예제의 인공물입니까? – cnicutar
위의 두 가지 의견은 "행 번호 배열을 어떻게 작성하고 있습니까?" – ooga