微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用awk替换值时,为什么我的字段分隔符搞砸了?

如何解决使用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 举报,一经查实,本站将立刻删除。