쉘 스크립트로 파일 편집

쉘 스크립트로 파일 편집

저는 스크립트를 개발 중이며 이미 채워진 텍스트 파일에 포함해야 하는 계산을 수행합니다. 파일 행의 형식은 다음과 같습니다.

1 20/10/16 12:00 take car in the garage joe's garage

스크립트 내에서 계산을 통해 숫자를 얻으면 해당 숫자가 행의 첫 번째 숫자를 대체합니다. 예를 들어, "calculate"는 값 15를 반환하고 스크립트는 문제의 파일에 액세스해야 하며 문제의 행을 다음과 같이 변경해야 합니다.

15 20/10/16 12:00 take car in the garage joe's garage

요점은 이 변경을 수행하는 방법을 모른다는 것입니다. bash, awk, sed 또는 사용 가능한 리소스에 있을 수 있습니다. 감사합니다.

답변1

어떻습니까:

awk -v old=$oldNum -v new=$newNum \
'{if ($1==old) {$1=new; print} else {print}}' input.txt > output.txt

다음과 같이 시도했습니다.

$ cat input.txt
2 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one

$ oldNum=2
$ newNum=15

awk 명령을 실행한 후 다음을 수행하십시오.

$ cat output.txt
15 19/10/16 15:30 some other line
1 20/10/16 12:00 take car in the garage joe's garage
3 17/10/16 5:30 another one

이것이 당신이 원했던 것입니까? 결과를 원본 파일에 표시하려면 mv새 이름의 출력 파일 만 입력 파일을 덮어써야 합니다(명령 의 앨리어싱을 방지하려면 input.txt슬래시 방지를 사용하십시오 ).\mvmv

참고: 더 짧은 awk 명령어를 사용해도 동일한 결과를 얻을 수 있지만 이 구문을 사용하면 더 읽기 쉽습니다. sed아마도 훨씬 더 간결한 방법으로 할 수 있을 것입니다.


편집: 파일 내에서 숫자 하나만 변경하려는 경우 이것이 작동한다는 것을 알고 있습니다. 귀하의 문제를 올바르게 이해했다면 다음에 대한 숫자를 다시 계산하고 싶습니다.모든줄을 만들고 새 번호로 파일을 만듭니다. 이를 수행하는 최적의 방법은 새 줄 번호 계산을 포함하는 것입니다.내부에스크립트 awk를 사용하면 쉘 루프를 생성할 필요가 없습니다. 이는 awk, echo, sed...와 같은 도구를 반복적으로 호출하면 비용이 많이 들기 때문에 일반적으로 나쁜 생각입니다. 다음과 같이 할 수 있습니다.

if [ -f $PWD/output.txt ]; then 
    # Remove old output if present in current directory
    \rm -f $PWD/output.txt
fi

awk '{ ###calculation here, result store in newNum###; $1=newNum; print}' input.txt > output.txt

예를 들어, 줄 번호마다 1씩 간단하게 증가시키려면 다음과 같이 하십시오.

awk '{$1++; print}' input.txt > output.txt

내부에 계산을 포함할 수 없거나 감히 포함할 수 없는 경우 awk파일에서 루프를 수행할 수 있지만 이는 제가 이해하는 bash스크립팅에 비해 매우 서투른 작업입니다.

if [ -f $PWD/output.txt ]; then 
    # Remove old output if present in current directory
    \rm -f $PWD/output.txt
fi

while read line
do
    newNum=###Calculation here for current line###
    echo $line | awk -v new=$newNum '$1=new' >> output.txt
done <input.txt

답변2

이 시도..

awk -v num="$variable" '{$1=num}1' input.txt

답변3

다음은 원하는 작업을 수행하는 짧은 Python 스크립트입니다. 사용법은 간단합니다. 파일, 줄이 시작하는 번호, 대신 보고 싶은 번호를 지정하세요.

데모:

    bash-4.3$ 고양이 data.txt
    2 19/10/16 15:30 다른 라인
    1 20/10/16 12:00 차고에서 조의 차고로 차를 가져가세요
    3 17/10/16 5:30 또 하나
    bash-4.3$ python renumber.py data.txt 1 15
    ['renumber.py', 'data.txt', '1', '15']
    bash-4.3$ 고양이 data.txt
    2 19/10/16 15:30 다른 라인
    15 20/10/16 12:00 차고에서 차를 타고 조의 차고로 가세요
    3 17/10/16 5:30 또 하나

암호:

import sys
import os

print(sys.argv)

with open(sys.argv[1]) as inputfile:
    with open('/tmp/temp.text','w') as tempfile:
         for line in inputfile:
             old = line.strip().split()
             if old[0] == sys.argv[2]:
                old[0] = sys.argv[3] 
                line = ' '.join(old) + '\n' 
             tempfile.write(line)

os.rename('/tmp/temp.text',sys.argv[1])

관련 정보