使用 shell 脚本编辑文件

使用 shell 脚本编辑文件

我正在开发一个脚本,它执行需要包含在已填充的文本文件中的计算。文件行的格式为:

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

在脚本中,我从计算中得到一个数字,该数字将替换该行的第一个数字。例如,“计算”返回值 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,这样您就不必创建 shell 循环,这通常是一个坏主意,因为重复调用诸如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

例如,如果我想简单地将每个行号加一:

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$ 猫数据.txt
    2 16/10/19 15:30 其他线路
    1 2016年10月20日 12:00 在车库 joe 的车库取车
    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$ 猫数据.txt
    2 16/10/19 15:30 其他线路
    15 2016年10月20日 12:00 在车库取车 乔的车库
    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])

相关内容