使用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'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...