使用awk对第二个值执行操作,仅在具有特定字符串的行上执行

时间:2016-10-21 16:35:21

标签: awk

确定。我有这个有效。耶!

awk '/string/ { print $0 }' file1.csv | awk '$2=$2+(int(rand()*10))' > file2.csv

但我希望我的文件的上下文也打印到file2.csv中。这个程序只打印包含我的字符串的行,这很好,这是一个开始。

我会,但是,我不能简单地将操作应用于每一行的$ 2值,因为不包含我的字符串的行上$ 2的值不会被更改。

所以,我希望原始(file1.csv)内容完好无损,唯一的区别是匹配我的字符串的行的调整值为$ 2。

有人能帮帮我吗?谢谢。

以下是来自原始csv 的4行:

2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30720, String, 0, 76, 100  
2, 32620, String, 0, 76, 0

预期输出除了$ 2的小变化之外是相同的:

2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30725, String, 0, 76, 100  
2, 32621, String, 0, 76, 0

2 个答案:

答案 0 :(得分:2)

$ awk 'BEGIN{FS=OFS=", "} /String/{$2+=int(rand()*10)}1' file

2, 0, Control, 0, 7, 1000
2, 0, Control, 0, 10, 540
2, 30722, String, 0, 76, 100
2, 32622, String, 0, 76, 0

您可能还需要在BEGIN块中初始化rand种子,否则您将始终获得相同的rand序列。

答案 1 :(得分:1)

像这样的东西,也许:

$ awk -F", " -v OFS=", " '$3 ~ /String/ { $2=$2+(int(rand()*10))} { print $0 }' file1.csv
2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30722, String, 0, 76, 100  
2, 32622, String, 0, 76, 0