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

次のようにファイルの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

その後、次のコマンドを使用できます。

# 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最高のIMHOです。しかし、perlこれもオプションなので、他の方法もたくさんあります。

;2つ()しかない場合は、3y/;/;/==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

関連情報