SED Удалить столбец CSV Если существует

Вы можете сделать трюк с опцией -E :

grep -E '(^|pattern)' file

Вот простой вывод:

enter image description here

4
04.01.2019, 12:07
4 ответа

Привет, Миллер(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
5
27.01.2020, 20:47

С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]вывести все поля, используя массив индексов, который мы получили для строки заголовка, используя табуляцию в качестве разделителя полей
5
27.01.2020, 20:47

С 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 будет деинициализирована, если такого столбца нет.
Вторая строка удаляет столбец, если он был найден.
Третья строка выводит запись.

1
27.01.2020, 20:47

Вы можете определить, какой столбец REFсоответствует grep, а затем решить удалить его, например. с сокращением GNU и предполагая, что ваши заголовки представляют собой отдельные слова, а разделители - табуляции:

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
1
27.01.2020, 20:47

Теги

Похожие вопросы