首页 > 解决方案 > 当我使用 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

现在我想用 0 替换第 4 列(coordinates_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    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

我是否必须在命令中的某处重新分配新的分隔符,或者如何实现文件中 NA 被零替换的字段仍然是制表符分隔?

标签: awkseparator

解决方案


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

此外,您可以将代码简化为(参见https://backreference.org/2010/02/10/idiomatic-awk/

awk 'BEGIN{FS=OFS="\t"} $4=="NA"{$4=0} 1'

推荐阅读