我正在开发一个脚本,它执行需要包含在已填充的文本文件中的计算。文件行的格式为:
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])