如果此列存在,我需要从表格 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