将更改保存到文件AWK / SED

时间:2014-03-17 20:17:17

标签: bash shell sed awk

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

19429,(Starbucks),390 Provan Walk,Glasgow,G34 9DL,-4.136909,55.872982 

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

现在我做了类似的事情。我正在检查每一行以找到输入的id用户,然后我将替换该值。

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”以替换第二个字段,并输入“Whatever”。现在我希望“(星巴克)”被替换为“Whatever”我所做的工作正常但不保存更改到文件中。我知道awk不应该这样做,但我不知道该怎么做。我在谷歌搜索了很多但仍然没有运气。

你能告诉我我该怎么做吗?我知道我可以用sed做,但我不知道如何。

2 个答案:

答案 0 :(得分:3)

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

awk -i inplace -v elem="$element" -v id="$code" -v value="$value" '
    BEGIN{ FS=OFS="," } $1==id{ $elem=value } 1
' "$path"

其他问题:

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. 除非您有明确的理由不完全理解所有含义和警告,否则请始终引用您的shell变量。
  2. 如果您要创建tmp文件,请使用"&&"在更换原件之前,如果tmp文件创建因任何原因而失败,则不要删除原始文件。
  3. 我完全支持用格拉斯哥的Whatever代替星巴克 - 我想他们在我的日子里(1986年Glasgow Uni Comp Sci alum)首先不会让它打开(1986年)

答案 1 :(得分:2)

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

#!/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;最后它使用逗号作为输出字段分隔符打印输出。如果没有匹配,它只会回显输入行。

将所有内容写入临时文件,然后覆盖原始文件。

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