awk 添加一列(如果不存在)

awk 添加一列(如果不存在)

如果“;”中不存在第 3 列(描述),我想添加它分隔文件。例子;

#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;6

预期产出

#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;No description;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;No description;6

答案1

看待这个问题的一种稍微不同的方式可能是“如果没有 4 列数据,则将第 3 列移动到第 4 列,并将第 3 列设置为无描述”。

这导致以下代码

awk -F';' 'BEGIN {OFS=";"} NF!=4 {$4=$3; $3="No description"} {print}'

答案2

使用miller

$ mlr --nidx --fs ';' put 'if (NF != 4) {$4 = $3; $3 = "No description"}' file

这与awk答案中使用的方法相同,但写在miller.

如果文件的第三列为空,如下所示

Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;;6

然后就可以使用下面的命令了。

# With headers 
$ mlr --csv --fs ';' put 'is_null($Description) {$Description = "No description" }' file 

# Without headers
$ mlr --csv  -N --fs ';' put 'is_null($3) {$3 = "No description"}' file

答案3

@Stephen Harris 给出的答案awk是最好的恕我直言。但既然perl也是一种选择,那么还有另外几种方法。

如果只有 2 ;( y/;/;/==2) 则缺少第三列,因此请添加说明No description

perl -pe's/(;[^;]+$)/;No description$1/ if y/;/;/==2' data

perl或者基本上是@Stephen Harris 答案的翻译awk

perl -F'/;/' -spe'$_=join $,,@F[0..1],q^No description^,$F[2] if $#F==2' -- -,=';' data.csv

答案4

为了完整起见,并且由于问题sed也被标记,这里不是基于列而是基于正则表达式sed解决方案 (注意:这与其正则表达式组一样好......所以,根据需要调整它们):

$ sed -E 's/^([^;]+);([^;]+);([0-9]+)$/\1;\2;No description;\3/' file
#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;No description;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;No description;6

相关内容