SEDはCSV列を削除します(存在する場合)。

SEDはCSV列を削除します(存在する場合)。

テーブルCSVファイルがある場合は、この列を削除する必要があります。

私のCSVファイル:

GENE REF ALT
AKT  A   G
AKT  G   G

希望の出力:REF列がある場合は削除します。

GENE  ALT
AKT    G
AKT    G

私はこれを試みます:

sed 's/\tREF.[^\t]*//' filename.csv

しかし、うまくいきません。

答え1

こんにちはミラー(http://johnkerl.org/miller/doc)そしてこのinput.csv

GENE,REF,ALT
AKT,A,G
AKT,G,G

とても簡単

mlr --csv cut -x -f REF input.csv

出力は次のとおりです

GENE,ALT
AKT,G
AKT,G

答え2

そしてperl

$ perl -F'\t' -lane '@non_ref_cols = grep { $F[$_] ne "REF" } 0..$#F if $. == 1;
                     print join "\t", @F[@non_ref_cols]' ip.txt
GENE    ALT
AKT     G
AKT     G
  • -F'\t'タブをフィールド区切り文字として使用
  • @non_ref_cols = grep { $F[$_] ne "REF" } 0..$#F if $. == 1ヘッダー行の場合、フィールドではなくすべての項目のインデックスを取得します。REF
  • print join "\t", @F[@non_ref_cols]ヘッダー行に対して取得したインデックス配列を使用し、タブをフィールド区切り文字として使用してすべてのフィールドを印刷します。

答え3

awkを使用してください:

awk -F'\t' -v OFS='\t' '
  NR == 1 {for (i=1; i<=NF; i++) if ($i == "REF") refCol = i}
  refCol {for (i = refCol + 1; i <=NF; i++) $(i-1) = $i; NF--}
  1
' file.csv

最初の行は、どの列がREF列かを探します。その列がない場合、refCol変数は初期化されません。
列が見つかったら、2番目の行からその列を削除します。
3行目はレコードを印刷します。

答え4

どの列がREFあるかを確認してgrepから削除することを決定できます。たとえば、GNU cut を使用し、タイトルが単一の単語で区切り文字がタブであるとします。

colnumber=$(head -n1 file.tsv | grep -o '[^\t]\+' | grep -nx 'REF' | cut -d: -f1)
[[ -n $colnumber ]] && cut --complement -f$colnumber file.tsv > file.tsv.new

出力:

GENE    ALT
AKT     G
AKT     G

関連情報