为什么我的字段分隔符在使用awk替换值时会出错?

为什么我的字段分隔符在使用awk替换值时会出错?,awk,separator,Awk,Separator,我是awk的新手,所以如果这是一个微不足道的问题,请道歉,但我没有找到一个类似的问题或答案来解决我的问题 我想做以下工作: 我有一个选项卡分隔的文本文件,由以下五列组成: Location Indices gene coordinates_1 coordinates_2 190..255 "190, 255" thrL "232, 237" NA 337..2799 "337, 2799" thrA

我是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
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    0   2855
3734..5020  "3734, 5020"    thrC    0   NA

现在我想用0替换第4列(坐标_1)中的所有“NA”值并保存文件。为此,我编写了以下命令:

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, 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
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    0   2855
3734..5020  "3734, 5020"    thrC    0   NA

但是,现在发生的情况是,在用零替换NA的每一行中,字段不再由制表符分隔,因此与原始文件不对应

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 0 2855
3734..5020 "3734, 5020" thrC 0 NA

我是否必须在命令中的某个位置重新分配一个新的分隔符,或者我如何才能实现文件中NAs被替换为零的字段仍然是制表符分隔的?

是的,在
awk
中有单独的变量来控制输入和输出字段分隔符。两者的默认值均为空格字符。如果使用当前值
OFS
更改任何字段,则将重建
$0
的内容,这就是为什么您只看到与给定条件匹配的行的空格更改

此外,您还可以将代码简化为(请参阅)


是的,您还需要将OFS设置为tab,例如:
FS=OFS=“\t”
是的,将OFS值设置为tab字符多谢您的建议,我想除了最后的“1”之外,我还了解该命令。此语句的作用是什么?计算为true的表达式将导致默认操作
print$0
(假设不存在任何操作块)。。对于真实条件,可以使用任何非零数字或非空字符串。。再举一个例子,
awk'BEGIN{FS=OFS=“\t”}$4==“NA”
将打印第四个字段为NA的行