1

我在将某些行与数字常量(由参数给出)匹配时遇到了一些麻烦。例如,给定文件中的以下数据:

0.6880228954232877  0.2284901699470367  0.3868277922222205   T   T   T
0.7303175733143661  0.3618318512370564  0.3974056922222218   T   T   T
0.0000000000000000  0.0000000000000000  0.0000000000000000   T   T   T
0.0000000000000000  0.3333333333333357  0.0000000000000000   T   T   T
0.0000000000000000  0.6666666666666643  0.0000000000000000   T   T   T
0.8333728559007199  0.8332938107659444  0.0000000000000000   T   T   T
0.5226283985455709  0.2857115516559929  2.3313236566666689   T   T   T
0.1621334092166649  0.4671478452296256  2.3549492962962972   T   T   T
0.6160582554738738  0.3498000553315919  2.3391425111111133   T   T   T
0.7070022591099487  0.3040360596000298  2.3690645440740710   T   T   T
0.5183050106710922  0.2156253703264568  2.2883209644444449   T   T   T
0.5226283985455709  0.2857115516559929  3.3313236566666689   T   T   T
0.1621334092166649  0.4671478452296256  3.3549492962962972   T   T   T
0.6160582554738738  0.3498000553315919  3.3391425111111133   T   T   T
0.7070022591099487  0.3040360596000298  3.3690645440740710   T   T   T
0.5183050106710922  0.2156253703264568  3.2883209644444449   T   T   T

我想匹配第三个字段以“2.”开头的行,然后将这些行的字母“T”简单替换为“F”。

我已经尝试了几次但都失败了,例如使用 awk:(请注意,第一个 $1 是给出模式“2.”的 bash 参数。

 awk -v pattern=$1 ' $3 ~ pattern { print $1,$2,$3" F F F"  }' file 

不工作。

我尝试过的另一种选择不是模式“2.”,而是“2”,所以表达式变为:

 awk -v pattern=$1 ' $3 ~ /pattern\./ { print $1,$2,$3" F F F"  }' file 

但它也不起作用。任何建议都非常感谢。

4

4 回答 4

3

我希望我能正确理解你的问题。我不明白您为什么分配 variable pattern,但从未使用过它。

使用您的示例数据,此行有效:

 awk '$3~/^2/&&$4=$5=$6="F"' file  

或者

awk '$3~/^2/{gsub(/T/,"F");print}' file

输出:

kent$  awk '$3~/^2/&&$4=$5=$6="F"' file   
0.5226283985455709 0.2857115516559929 2.3313236566666689 F F F
0.1621334092166649 0.4671478452296256 2.3549492962962972 F F F
0.6160582554738738 0.3498000553315919 2.3391425111111133 F F F
0.7070022591099487 0.3040360596000298 2.3690645440740710 F F F
0.5183050106710922 0.2156253703264568 2.2883209644444449 F F F

或者

kent$  awk '$3~/^2/{gsub(/T/,"F");print}' file
0.5226283985455709  0.2857115516559929  2.3313236566666689   F   F   F
0.1621334092166649  0.4671478452296256  2.3549492962962972   F   F   F
0.6160582554738738  0.3498000553315919  2.3391425111111133   F   F   F
0.7070022591099487  0.3040360596000298  2.3690645440740710   F   F   F
0.5183050106710922  0.2156253703264568  2.2883209644444449   F   F   F

编辑

awk -v p="^2" '$3~p{gsub(/T/,"F");print}' file

如果您的模式存储在 shell var 中:

pattern="^2"
awk -v p="$pattern" '$3~p{gsub(/T/,"F");print}' file
于 2013-05-16T21:08:30.067 回答
1

以下 awk 将允许打印从第三列以 2 开始的行。然后,您可以根据需要将 T 替换为 F。

awk '{
if ($3 ~ "^2\..*") { print $0 }
}'

此外,sed 可能更适合此问题(因为这是搜索替换类型问题):

这样的事情可以做你想做的事:

sed 's/\(.*\) \(.*\) \(2\.[0-9]*\) \(.*\)/\1 \2 \3   F   F   F/g'
于 2013-05-16T21:11:59.767 回答
1

以下对我有用gnu awk

awk -v pattern='^2\\.' ' $3 ~ pattern {print($0)}' samp.t
0.5226283985455709  0.2857115516559929  2.3313236566666689   T   T   T
0.1621334092166649  0.4671478452296256  2.3549492962962972   T   T   T
0.6160582554738738  0.3498000553315919  2.3391425111111133   T   T   T
0.7070022591099487  0.3040360596000298  2.3690645440740710   T   T   T
0.5183050106710922  0.2156253703264568  2.2883209644444449   T   T   T
于 2013-05-16T21:02:43.033 回答
1

您的错误可能是您创建了一个变量pattern,但使用了一个变量zlevel。您还需要锚定表达式(^以匹配字符串的开头),否则任何包含的行都2将被匹配。以下应该有效:

e="2\."
awk -v pattern="^${e//\\/\\\\}" '$3 ~ pattern {gsub(/T/, "F", $0); print}'

${e//\\/\\\\}只是为了转义反斜杠,所以正则表达式不会变得比必要的复杂。

于 2013-05-16T21:07:49.677 回答