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 变量将未初始化。
如果找到该列,第二行将删除该列。
第三行打印记录。

答案4

您可以确定哪一列REF位于 with 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

相关内容