我有一个很大的文本文件,用逗号分隔。
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“以替换第二个字段,也输入”任意“。现在我想把"(Starbucks)“替换为"Whatever”,我做的一切都很好,但没有将更改保存到文件中。我知道awk不应该这样做,但我不知道怎么做。我在谷歌上搜索了很多次,但还是没有找到答案。
你能告诉我该怎么做吗?我知道我可以用sed做到这一点,但我不知道怎么做。
发布于 2014-03-18 06:56:44
较新版本的GNU awk支持就地编辑:
awk -i inplace -v elem="$element" -v id="$code" -v value="$value" '
BEGIN{ FS=OFS="," } $1==id{ $elem=value } 1
' "$path"对于其他awks:
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"备注:
发布于 2014-03-18 04:47:34
在处理特定变量字段时,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;最后,它使用逗号作为输出字段分隔符来打印输出。如果没有匹配,它只回显输入行。
所有内容都被写入一个临时文件,然后覆盖原始文件。
不是很好,但它可以完成工作。
https://stackoverflow.com/questions/22464445
复制相似问题