首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将更改保存到文件AWK/SED

将更改保存到文件AWK/SED
EN

Stack Overflow用户
提问于 2014-03-18 04:17:17
回答 2查看 1.2K关注 0票数 0

我有一个很大的文本文件,用逗号分隔。

代码语言:javascript
复制
19429,(Starbucks),390 Provan Walk,Glasgow,G34 9DL,-4.136909,55.872982 

第一个是唯一的id。我希望用户输入id,并为以下6个字段之一输入一个值,以便被替换。此外,我要求他输入一个2-7的值,以确定哪个字段应该被替换。

现在我已经做了这样的事情。我检查每一行以查找用户输入的id,然后替换该值。

代码语言:javascript
复制
awk -F ',' -v elem=$element -v id=$code -v value=$value '{if($1==id) {if(elem==2) { $2=value } etc }}' $path

其中$path = /root/clients.txt

假设用户输入"2“以替换第二个字段,也输入”任意“。现在我想把"(Starbucks)“替换为"Whatever”,我做的一切都很好,但没有将更改保存到文件中。我知道awk不应该这样做,但我不知道怎么做。我在谷歌上搜索了很多次,但还是没有找到答案。

你能告诉我该怎么做吗?我知道我可以用sed做到这一点,但我不知道怎么做。

EN

回答 2

Stack Overflow用户

发布于 2014-03-18 06:56:44

较新版本的GNU awk支持就地编辑:

代码语言:javascript
复制
awk -i inplace -v elem="$element" -v id="$code" -v value="$value" '
    BEGIN{ FS=OFS="," } $1==id{ $elem=value } 1
' "$path"

对于其他awks:

代码语言:javascript
复制
awk -v elem="$element" -v id="$code" -v value="$value" '
    BEGIN{ FS=OFS="," } $1==id{ $elem=value } 1
' "$path" > /usr/tmp/tmp$$ &&
mv /usr/tmp/tmp$$ "$path"

备注:

  1. 始终引用您的外壳变量,除非您有明确的理由不这样做,并且完全理解所有暗示和警告。
  2. 如果您正在创建临时文件,请在将原始文件替换为原始文件之前使用"&&“,这样如果临时文件创建因任何原因而失败,您就不会删除原始文件。
  3. 我完全支持将星巴克替换为格拉斯哥的任何东西-我愿意认为,在我那个时代(1986年的格拉斯哥大学),他们不会让它打开的:-)。
票数 3
EN

Stack Overflow用户

发布于 2014-03-18 04:47:34

在处理特定变量字段时,awksed容易得多,但它没有就地处理。因此,您可以执行以下操作:

代码语言:javascript
复制
#!/bin/bash
code=$1
element=$2
value=$3
echo "code is $code"
awk -F ',' -v elem=$element -v id=$code -v value=$value 'BEGIN{OFS=",";} /^'$code',/{$elem=value}1' mydb > /tmp/mydb.txt
mv /tmp/mydb.txt ./mydb

这将查找以code开头、后跟逗号的行(您也可以使用($1==code)),然后将elem字段设置为value;最后,它使用逗号作为输出字段分隔符来打印输出。如果没有匹配,它只回显输入行。

所有内容都被写入一个临时文件,然后覆盖原始文件。

不是很好,但它可以完成工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22464445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档