я - новичок в 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
я знаю, что сделал неправильно, но любое предложение будет полезно! Спасибо
Если у вас есть 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 расширяет ее с помощью массива групп захвата. )
Я бы пошел с:
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
Может быть, вы можете попробовать так:
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
в конце команды.