저는 채워진 텍스트 파일에 포함되어야 하는 계산을 수행하는 스크립트를 개발 중입니다. 파일 행 형식은 다음과 같습니다.
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
\mv
mv
참고: 더 짧은 awk 명령어를 사용해도 동일한 결과를 얻을 수 있지만 이 구문을 사용하면 더 읽기 쉽습니다. sed
아마도 이것은 더 간결한 방법으로 이루어질 수 있을 것입니다.
편집: 파일에서 숫자 1개만 변경하려는 경우 이것이 작동한다는 것을 깨달았습니다. 귀하의 질문을 올바르게 이해했다면 숫자를 다시 계산하고 싶습니다모든줄을 만들고 이러한 새 번호로 파일을 만듭니다. 이를 수행하는 가장 좋은 방법은 새 줄 번호 계산을 포함하는 것입니다.~에, , ...와 같은 도구를 반복적으로 호출하는 것은 결국 비용이 많이 들 수 있기 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 16/10/19 15:30 다른 노선 1 2016년 10월 20일 12시에 차고 조의 차고에서 차를 인수했습니다. 3 2016년 10월 17일 5:30 또 하나 bash-4.3$ python renumber.py data.txt 1 15 ['renumber.py', 'data.txt', '1', '15'] bash-4.3$ 고양이 data.txt 2 16/10/19 15:30 다른 노선 2016년 10월 20일 12:00 Joe's Garage 차고에서 차를 픽업하세요. 3 2016년 10월 17일 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])