多种模式匹配

时间:2015-05-11 07:02:56

标签: shell awk

我有一个输入文件,其列由|分隔如下。

[3yu23yuoi]|$name
!$fjkdjl|[kkklkl]
$hjhj|$mmkj

我希望输出为

0          $name
!$fjkdjl     0
$hjhj      $mmkj  

每当字符串以$或!$或"任何"开头时,我希望它以其他方式打印0。 我尝试了以下命令。它只打印与输入文件相同的内容。

awk -F="|" '{if (($1 ~ /^.*\$/) || ($1 ~ /^.*\!$/) || ($1 ~ /^any/)) {print $1} else if ($1 ~ /^\[.*/){print "0"} else if (($2 ~ /^.*\$/) || ($2 ~ /^.*\!$/) || ($2 ~ /^any/)) {print $2} else if($2 ~ /^\[.*/){print "0"}}' input > output

1 个答案:

答案 0 :(得分:1)

这应该做:

awk -F\| '{$1=$1;for (i=1;i<=NF;i++) if ($i!~/^(\$|!\$|any)/) $i=0}1' file
0 $name
!$fjkdjl 0
$hjhj $mmkj

如果数据不是以$ !$any开头,请将其设为0

或者如果您喜欢tab作为分隔符:

awk -F\| '{$1=$1;for (i=1;i<=NF;i++) if ($i!~/^(\$|!\$|^any)/) $i=0}1' OFS="\t" file
0       $name
!$fjkdjl        0
$hjhj   $mmkj

$1=$1确保所有行都具有相同的输出,即使没有更改数据。