2016-10-28 3 views
0

나는 4 개의 행을 파일에 삽입하는 스크립트를 작성하려고한다. 두 개의 숫자 사이에 새 텍스트를 추가해야했습니다. 예배쉬 (Bash)가 숫자를 찾아 내용을 추가한다

: 는 내가 그런 행 번호와 함께 작동하도록 시도 수 12,340과 12,348 사이 12345 ...

추가했다 :

newpartnerID = $partnerid 

while [[ $schleifeende != "Ende" ]] 

do 
    if [[ $(grep -Eo "$newpartnerID" text.txt; echo $?) -eq 1 ]] 
    then 
     let newpartnerID=$newpartnerID+1 
    else 
     schleifeende="Ende" 
     countID=$(grep -n "$newpartnerID" text.txt | cut -f1 -d:) 
     let countIDnew=${countID}-1 
    fi 
done 

을하지만 작동하지 않습니다 D

해당 작업에 대해보다 쉽고 간단한 해결책을 알고 계십니까?

+0

사이트 노트 : 영어와 독일어 변수 이름을 섞어도보기 싫지만. – hek2mgl

답변

0

예를 들어 새로운 파트너 ID가 1234 인 경우 grep과 관련이 있어야합니다. 예를 들어, 기존 행과 12340 및 12348이 일치하므로 포함되지 않습니다.

파일 정렬은 아마도 awk 및/또는 sed와 같은 bash 이외의 도구를 사용하는 것이 더 좋습니다.

partnerid1:some text 
line1 for partnerid1 
line2 for partnerid1 
line3 for partnerid1 
line4 for partnerid1 
partnerid2:some other text 
line1 for partnerid2 
line2 for partnerid2 
line3 for partnerid2 
line4 for partnerid4 

주문한 위 파일 가정하면, 다음을 수행 할 수 있습니다 :

당신의 파일이 partnerid1가 partnerid2 이하가되도록 형식의 주문에 있으며 관련 각 행이 나타납니다

#!/bin/bash 

partnerid=`head -1 $1 | cut -f1 -d:` 
partnerrows=`wc -l $1 | awk '{print $1}'` 

# find insert point 
FN=text.txt 
NEWFN=new.text.txt 
Linenumber=`cat $FN | awk -v partnerid=$partnerid -v partnerdata=$1 -v rowcount=$partnerrows ' 
    BEGIN { 
     partnerid = partnerid + 0 
     INRANGE=0 
     inserthere=0 
    } 
    /^[0-9]+:/ { 
      sub(/\:.*/,"") 
      id = $0 + 0 
      if (partnerid == id) { 
       inserthere = -1 
       exit 
      } 
      # if not in range, check if it is now 
      if (INRANGE == 0) { 
       if (partnerid > id) { 
        INRANGE = 1 
        inserthere = NR + rowcount - 1 
       } 
      } 
      # if in range and this id now less, then have our location 
      if (INRANGE == 1) { 
       inserthere = NR + rowcount - 1 
       if (partnerid < id) { 
        inserthere = NR -1 
        exit 
       } 
      } 
     } 
    END { 
     print inserthere 
    } 
'` 

FNLEN=`wc -l $FN | awk '{print $1}'` 
rm -f $NEWFN 
touch $NEWFN 
if [ $Linenumber -gt 0 ]; then 
    cat $FN | sed -n "1,${Linenumber}p" >> $NEWFN 
fi 
if [ $Linenumber -ge 0 ]; then 
    cat $1 >> $NEWFN 
fi 
if [ $Linenumber -ge 0 -a $Linenumber -le $FNLEN ]; then 
    Linenumber=$((Linenumber + 1)) 
    cat $FN | sed -n "${Linenumber},\$p" >> $NEWFN 
fi