仅在基于变量和特殊字符的条件满足的情况下,查找并替换值

时间:2020-09-01 10:21:29

标签: unix awk sed

我有一个具有以下格式的输入数据文件(data.csv),我需要进行更新以获取结果

ABC,SOME CONTENT,**XYZ**,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,
ABC,SOME CONTENT,**XY1**,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,
ABC,SOME CONTENT,**XY2**,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,
ABC,SOME CONTENT,**XY3**,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,

我的条件是我有一个包含以下内容的文件(input.txt)

XYZ
XY3

我需要检查data.csv中input.txt中每个值的记录,并将列中的值从#AB DEF更新为#in some country,并将值从0.1更新为{ {1}}仅用于相应的记录,并将其放回同一文件中。

结果:

0

我尝试使用以下命令(我不确定如何检查sed命令中的条件),它会更新所有记录,我知道这是由于结尾处的ABC,SOME CONTENT,**XYZ**,SOME CONTENT,,**#in some country**,,,,,,,,,,,**0**,, ABC,SOME CONTENT,**XY1**,SOME CONTENT,,**#AB DEF**,,,,,,,,,,,**0.1**,, ABC,SOME CONTENT,**XY2**,SOME CONTENT,,**#AB DEF**,,,,,,,,,,,**0.1**,, ABC,SOME CONTENT,**XY3**,SOME CONTENT,,**#in some country**,,,,,,,,,,,**0**,, ,但不确定如何仅将其限制为符合我的g

条件的记录
XYZ

我必须在数据中包含sed -i "s|#AB DEF,,,,,,,,,,,0.1,,|#in some country,,,,,,,,,,,0,,|g" data.csv #,我试图将数据放入变量中并试图替换它,但是sed识别出有特殊字符并且失败了。

3 个答案:

答案 0 :(得分:4)

$ awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1]; next} $3 in a{$6="#in some country"; $17=0} 1' input.txt data.csv
ABC,SOME CONTENT,XYZ,SOME CONTENT,,#in some country,,,,,,,,,,,0,,
ABC,SOME CONTENT,XY1,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,
ABC,SOME CONTENT,XY2,SOME CONTENT,,#AB DEF,,,,,,,,,,,0.1,,
ABC,SOME CONTENT,XY3,SOME CONTENT,,#in some country,,,,,,,,,,,0,,

以上假设输入/输出中的*是为了强调而添加的,实际上并没有出现在数据中。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed 's#.*#/,[^,]*,&,/ba#' inputFile | sed -i -Ef - -e 'b;:a;s/#AB DEF[^,]*/#in some country/;s/0\.1/0/' file

构建一组命令以对file的内容进行过滤inputFile,并将其通过管道传递给sed的第二次调用,以操纵file的内容。

答案 2 :(得分:-1)

发布问题后我得到了答案,所以将答案发布回来

if (int.TryParse(textBox1.Text, out int i))
{
    textBox1.Text = (i + 1).ToString();
}