Awk 将第二个和第三个替换为。如果是0
我有三个字段的数据。字段2和3可以为零,如果为零,我想改为“.” 示例数据: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=&
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’
我认为这是最适合你的问题。请回答你的问题并澄清。