, как разделить последовательность из столбца с помощью awk

я - новичок в Linux. У меня есть файл как это:

 col1                                  col2   col3
 ID1234567-DNA_A01 chr1_10203040_T/C   gene   0
 ID1234568-DNA_A02 chr1_10203050_T/A   gene   0
 ID1234569-DNA_A03 chr1_10203060_A/G   gene   0
 ID1234570-DNA_A04 chr1_10203070_C/T   gene   0

я хочу использовать только первый столбец и разделить каждую строку на 4 столбца:

 #CHROM  POS      REF  ALT
 1       10203040  T    C
 1       10203050  T    A
 1       10203060  A    G
 1       10203070  C    T

я пытался сделать:

  awk 'BEGIN{OFS="\t";FS="\t"; print"#CHROM","POS","REF","ALT"} | cut -d' ' -f2- {print 
 substr($1,4,1),substr($1,6}' old_file > new_file

я знаю, что сделал неправильно, но любое предложение будет полезно! Спасибо

0
задан 9 March 2021 в 15:57

3 ответа

Если у вас есть GNU awk (gawk), то - несмотря на советы здесь - вы могли бы рассмотреть захват нужных вам частей с помощью регулярного выражения, а не разделения строк:

$ gawk '
    BEGIN{OFS="\t"; print "#CHROM","POS","REF","ALT"}
    match($2,/chr([0-9])_([0-9]+)_([ACGT])[/]([ACGT])/,a) {print a[1],a[2],a[3],a[4]}
  ' old_file
#CHROM  POS     REF     ALT
1       10203040        T       C
1       10203050        T       A
1       10203060        A       G
1       10203070        C       T

(В других реализациях awk есть функция match, но версия GNU расширяет ее с помощью массива групп захвата. )

0
ответ дан 18 March 2021 в 23:27

Я бы пошел с:

awk 'NR>1 {print $2}' file \
| awk -F'[_/]' 'BEGIN{OFS="\t"; print "#CHROM","POS","REF","ALT"}{$1=$1}1'
  • первым awk , выведите только второе поле.
  • Второй awk , выберите [_ /] в качестве сепаратора поля, напечатайте новый заголовок и поля. $ 1 = 1 $ 1 Триггеры реорганизации полей, которые необходимы, поскольку мы изменяем сепаратор вывода в \ T .
  • Вы можете добавить | столбца -T , чтобы сделать столбцы в строке.

Мы могли бы сделать это за один ходить, но тогда вам нужно использовать разделение, которое, я думаю, что сложнее.


Выход:

#CHROM  POS       REF  ALT
chr1    10203040  T    C
chr1    10203050  T    A
chr1    10203060  A    G
chr1    10203070  C    T
1
ответ дан 18 March 2021 в 23:27

Может быть, вы можете попробовать так:

cut -d " " -f 2 test.txt | awk -F '[_,/]' 'BEGIN{printf "#CHROM \tPOS\tREF\tALT\n"} {printf ("%s\t %s\t %s\t %s\n" ,$1, $2, $3, $4)}'

здесь Test.txt - это имя вашего файла. И если вы хотите перенаправить вывод в файл, просто добавьте > New_file.txt в конце команды.

1
ответ дан 18 March 2021 в 23:27

Другие вопросы по тегам:

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