Awk 将第二个和第三个替换为。如果是0

Awk 将第二个和第三个替换为。如果是0,awk,Awk,我有三个字段的数据。字段2和3可以为零,如果为零,我想改为“.” 示例数据: 1 0 0 2 0 0 3 0 0 4 0 1 5 1 0 以下是我尝试过的: awk '{ if($2=="0" && $3=="0"){ `$3=".";` `$2=".";` } else if($3=="0"){ $3=&

我有三个字段的数据。字段2和3可以为零,如果为零,我想改为“.”

示例数据:

1 0 0
2 0 0
3 0 0
4 0 1
5 1 0
以下是我尝试过的:

awk '{
     if($2=="0" && $3=="0"){
     `$3=".";`
     `$2=".";`
       }
       else if($3=="0"){
        $3="."
        } 
      else if($2=="0"){
       $2="." }
       else {
        $2=$2;
        $3=$3;
        }

     print $0
}' file.txt>changedfile.txt
它只改变了第二个字段,而没有改变第三个字段。
非常感谢,我想在这里用更通用的方法使用Awk控制结构,请尝试以下解决方案。您只需在要执行检查的地方传递字段号,如果它的零将其字段号传递给名为
fillValues
的函数,则替换为点号。现在我传递了
fillValues(2,3)
,因为您只想检查第二个和第三个字段,这可以处理n个字段

$ cat input
1 0 0
2 0 0
3 0 0
4 0 1
5 1 0
$ awk '$2 == 0 { $2 = "." } $3 == 0 { $3 = "." }1' input
1 . .
2 . .
3 . .
4 . 1
5 1 .
awk '
function fillValues(fields){
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    $arr[i]=$arr[i]==0?".":$arr[i]
  }
}
{
  fillValues("2,3")
}
1
'  Input_file
awk'
函数值(字段){
num=拆分(字段,arr,“,”)

对于(i=1;i使用更通用的方法,请尝试以下解决方案。您只需在要执行检查的位置传递字段号,如果其零将其字段号传递给名为
fillValues
的函数,则替换为点号。现在我传递了
fillValues(2,3)
由于您只想检查第二个和第三个字段,因此可以处理n个字段

awk '
function fillValues(fields){
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    $arr[i]=$arr[i]==0?".":$arr[i]
  }
}
{
  fillValues("2,3")
}
1
'  Input_file
awk'
函数值(字段){
num=拆分(字段,arr,“,”)

对于(i=1;i使用
gnu awk

awk'{print gensub(/(\s)0(\s)/,“\\1\\2”,“g”,gensub(/(\s)0$/,“\\1.”,“1”))文件
1.
2.
3.
4. 1
5 1 .

使用gnu awk

awk'{print gensub(/(\s)0(\s)/,“\\1\\2”,“g”,gensub(/(\s)0$/,“\\1.”,“1”))文件
1.
2.
3.
4. 1
5 1 .

如果始终有3个字段,您也可以循环最后2个字段,并将值设置为一个点,如果任何值为零

awk '{                          # Start the program
  for (i=2; i<=NF; ++i) {       # Loop only the last 2 fields
    if ($i == 0) $i="."         # If the value of the field is 0, set it to a dot
  }
} 1' file                       # print the whole line

如果始终有3个字段,您还可以循环最后2个字段,并将值设置为点,如果任何值为零

awk '{                          # Start the program
  for (i=2; i<=NF; ++i) {       # Loop only the last 2 fields
    if ($i == 0) $i="."         # If the value of the field is 0, set it to a dot
  }
} 1' file                       # print the whole line

您可以使用三元运算符(
?:
)执行此任务,方法如下,让
file.txt
内容

1 0 0
2 0 0
3 0 0
4 0 1
5 1 0
然后

输出

1 . .
2 . .
3 . .
4 . 1
5 1 .
说明:在这种情况下,三元运算符比使用if-else更紧凑。它包括check
valueiftrue
valueifelse


(在gawk 4.2.1中测试)

对于此任务,您可以使用三元运算符(
?:
),方法如下,让
file.txt
内容

1 0 0
2 0 0
3 0 0
4 0 1
5 1 0
然后

输出

1 . .
2 . .
3 . .
4 . 1
5 1 .
说明:在这种情况下,三元运算符比使用if-else更紧凑。它包括check
valueiftrue
valueifelse


(在gawk 4.2.1中测试)

我想这将是最短的
awk

$ awk '!$2{$2="."} !$3{$3="."}1' file

1 . .
2 . .
3 . .
4 . 1
5 1 .
使用
sed更简短

$ sed 's/ 0\b/ ./g' file

我想这将是最短的
awk

$ awk '!$2{$2="."} !$3{$3="."}1' file

1 . .
2 . .
3 . .
4 . 1
5 1 .
使用
sed更简短

$ sed 's/ 0\b/ ./g' file

谢谢威廉。它解决了我的问题。我有一个问题:1从你的代码中引用了什么:$awk'$2==0{$2=“.“}$3==0{$3=“.“}1”input@setegnalemu谢谢威廉。它解决了我的问题。我有一个问题:1从你的代码中引用了什么:$awk'$2==0{$2=“.”}$3==0{$3=“.”}1' input@setegnalemu今天看起来是100k,超级:)今天看起来是100k,超级:)当它是第一个字段时,它会将
0
更改为
,但OP只想更改stackoverflow移动应用程序上编辑的第二个和第三个字段,该应用程序将非ascii双引号而不是ascii
"不管怎样,我有2个解决方案,两个都应该工作。你可能没有得到我所指的问题。考虑第一个列,而不是< 1】0 \ N2 0 \ N3 1 \ N4 0 \ N5 0 \ N < /代码>,它是“代码> 0 0 \ N1 0 0 \0 0 2 \ N4 0 \n代码/代码>,你的两个命令也将替换这些在第一列中的AUG。e> 事实上,这是OP的意图,因为OP声明第1列中没有零。我试图尽我所能解析所有有效的注释。当它是第一个字段时,它会将
0
更改为
,但OP只想更改我在stackoverflow移动应用程序上编辑的第2和第3个字段,该应用程序将非ascii双引号插入ascii码的ead
"不管怎样,我有2个解决方案,两个都应该工作。你可能没有得到我所指的问题。考虑第一个列,而不是< 1】0 \ N2 0 \ N3 1 \ N4 0 \ N5 0 \ N < /代码>,它是“代码> 0 0 \ N1 0 0 \0 0 2 \ N4 0 \n代码/代码>,你的两个命令也将替换这些在第一列中的AUG。e> 事实上,这是OP的意图,因为OP声明第1列中没有零。我尽我所能解决所有有效的注释。第一个字段在任何情况下都不会是0?而且所有数字都是一个单一长度的数字?如果是这样,那么我将取消删除给定的答案
awk'{gsub(“0”),awk}1'
我认为这是最适合你的问题。请你的问题和澄清。第一个字段在任何情况下都不会是0?而且所有数字都是一个长度的数字?如果是这样,那么我将取消删除我的给定答案
awk'{gsub(“0”),awk}1’
我认为这是最适合你的问题。请回答你的问题并澄清。