Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 替换除最后一列之外的所有列中的所有文本_Perl_Bash_Shell_Unix_Awk - Fatal编程技术网

Perl 替换除最后一列之外的所有列中的所有文本

Perl 替换除最后一列之外的所有列中的所有文本,perl,bash,shell,unix,awk,Perl,Bash,Shell,Unix,Awk,我有一个数据文件,可以读取 field1 field2 diseased discrete discrete discrete class No Yes No Yes Yes Yes No No No 我想用问号(?)替换除最后一列之外的所有列中的No。这只是一个有三列的玩具示例,我有数千列的数据。因此,单独行动是没有意义的。前三行也是标题,我

我有一个数据文件,可以读取

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
No Yes No 
Yes Yes Yes
No No No
我想用问号(?)替换除最后一列之外的所有列中的No。这只是一个有三列的玩具示例,我有数千列的数据。因此,单独行动是没有意义的。前三行也是标题,我希望它们保持原样。所以我希望我的结果是

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No 
Yes Yes Yes
? ? No
我希望在不更改文件格式的情况下执行此操作。到目前为止,我可以通过删除最后一列并替换“否”,然后再次追加最后一行来实现这一点,但这样会丢失格式。也谢谢你的帮助。 在某些情况下,当有大量“是”且最后一列为“否”时,会在末尾添加一些选项卡。命令

cat -e test 
导致

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No$
Yes Yes Yes
? ? No
Yes Yes No $

我不希望最后一个No和$

之间有这样的空格,例如:

$ awk 'BEGIN{OFS=FS="\t"} {for (i=1; i<NF; i++) if ($i=="No") $i="?"}1' a
?       Yes     No 
Yes     Yes     Yes
?       ?       No
$awk'BEGIN{OFS=FS=“\t”}{for(i=1;i使用awk:

awk -v ccol=3 '{for (i=1; i<=NF; i++) if (i != ccol && $i=="No") $i="?"} 1' OFS='\t' file

awk-vccol=3'{for(i=1;i另一个
awk

awk '$1=="No" {$1="?"} $2=="No" {$2="?"} 1' file

除非您有一些可能与
No
匹配的其他标题,否则您应该选择一些非常简单的标题,例如:

perl -pwe 's/\bNo\b(?!\s*$)/?/g' infile > outfile
它将替换所有周围有单词边界的
No
字符串。Shell重定向将输出存储在新文件中。您也可以使用
-i
开关,但我通常不建议新用户使用它


使用否定的前瞻性断言以确保它不是行上的最后一个匹配项。

< P>这里,我认为最后一个列不能被替换(如果需要的话,可以很容易地修改它)。 使用awk:

[ ~]$ awk '{for (i=1;i<NF;i++){if ($i=="No"){$i="?"}}; print $0}' test.txt 
field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No
Yes Yes Yes
? ? No

注意,可能会有超过3列。不会产生所需的输出。甚至在最后一列中也会替换。啊哈,我没有看到。这很容易修复。有趣的是,我的文件是以制表符分隔的,它会更改为以空格分隔的文件。但问题是,如果所有列中都有“是”,则制表符分隔的文件会保留。有没有简单的方法修复此问题?是的现在,请查看已编辑的命令,该命令使用OFS='\t'
将输出制表符分隔。@LoveDevention:当然,此awk命令不认为只需要跳过最后一列,因为您可以将col作为参数传递。如果有一列包含所有yes like和last column No,它会在No之后添加一个制表符。否则,就可以了。有什么方法来解决这个问题吗这是吗?是的,不是,不是,不是,cat-e文件将产生是,是,否$?是,否$让我尝试解决这个问题。有趣的是,我的文件是以制表符分隔的,它将变为以空格分隔的文件。但问题是,如果所有列中都有“是”,则以制表符分隔的文件将保留。有没有简单的方法来解决这个问题??@lovedevenation
BEGIN{FS=OFS=“\t”}
@jkshah-wow,当我看到你的评论时,我正在更新它hehe@lovedynasty除非你给出正确的解释,否则我不会继续。请注意,阿努巴瓦和我都在检查它,你从一个答案到另一个答案,试图在没有正确解释的情况下解决问题。很抱歉,这是源代码的问题…在o中其他情况下没有,但在所有情况下都有。对不起!!现在它起作用了
[ ~]$ sed "s/No/\?/g; s/\?\ *$/No/g" test.txt 
field1 field2 diseased 
discrete discrete   discrete                                                    
                class
? Yes No
Yes Yes Yes
? ? No