我有一个用逗号分隔的巨大文本文件。
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做,但我不知道如何。答案 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 :(得分:2)
awk
比sed
更容易处理特定的变量字段,但它没有就地处理。因此,您可以执行以下操作:
#!/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
;最后它使用逗号作为输出字段分隔符打印输出。如果没有匹配,它只会回显输入行。
将所有内容写入临时文件,然后覆盖原始文件。
不是很好,但它完成了工作。