如何解决使用awk替换值时,为什么我的字段分隔符搞砸了?
我对awk还是很陌生,所以如果这是一个琐碎的问题,请您道歉,但是我没有找到类似的问题或答案可以解决我的问题。
我要执行以下操作: 我有一个制表符分隔的文本文件,该文件由以下五列组成:
Location Indices gene coordinates_1 coordinates_2
190..255 "190,255" thrL "232,237" NA
337..2799 "337,2799" thrA "2094,2102" NA
2801..3733 "2801,3733" thrB NA 2855
3734..5020 "3734,5020" thrC NA NA
现在,我想将第4列(coordinates_1)中的所有“ NA”值替换为0,然后保存文件。为此,我编写了以下命令:
awk '
BEGIN { FS = "\t" }
{
if ($4 == "NA")
$4 = 0;
print $0;
}' original_data.txt > NAs_to_zero.txt
我想要的输出应如下所示:
Location Indices gene coordinates_1 coordinates_2
190..255 "190,3733" thrB 0 2855
3734..5020 "3734,5020" thrC 0 NA
但是现在发生的是,在将NA替换为零的每一行中,字段不再由制表符分隔,因此与原始文件不对应。
Location Indices gene coordinates_1 coordinates_2
190..255 "190,2102" NA
2801..3733 "2801,3733" thrB 0 2855
3734..5020 "3734,5020" thrC 0 NA
我是否必须在命令中的某处重新分配一个新的分隔符,或者我如何才能实现将NA替换为零的文件中的字段仍用Tab键分隔?
解决方法
是的,在awk
中有单独的变量来控制输入和输出字段分隔符。两者的默认值都是空格字符。如果将任何字段更改为$0
的当前值,则会重建OFS
的内容,这就是为什么您只看到与给定条件匹配的行的空格更改的原因。
此外,您可以将代码简化为(请参见https://backreference.org/2010/02/10/idiomatic-awk/)
awk 'BEGIN{FS=OFS="\t"} $4=="NA"{$4=0} 1'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。