Редактирование столбцов и переименование таблицы с разделителями табуляции в Bash - PullRequest
0 голосов
/ 18 октября 2018

Извиняюсь за основной вопрос, но я застрял.У меня есть основной текстовый файл с разделителями табуляции, который называется map.txt.Первая строка файла - это имена столбцов, перед которыми стоит символ #.Обратите внимание, что это файл с разделителями табуляции.Вот вывод head map.txt:

#SampleID   BarcodeSequence LinkerPrimerSequence    sample_type Description geneticSampleID
OSBS.087.39.M.32.18.20140227    TCCCTTGTCTCC    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A1   OSBS_087-M-32-18-20140227-gen
OSBS.048.41.M.37.33.20140227    ACGAGACTGATT    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A2   OSBS_048-M-37-33-20140227-gen
OSBS.048.23.M.15.31.20140227    GCTGTACGGATT    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A3   OSBS_048-M-15-31-20140227-gen
OSBS.047.21.M.20.3.20140227 ATCACCAGGTGT    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A4   OSBS_047-M-20-3-20140227-gen
OSBS.119.23.M.18.38.20140227    TGGTCAACGATA    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A5   OSBS_119-M-18-38-20140227-gen
OSBS.047.41.M.22.36.20140227    ATCGCACAGTAA    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A6   OSBS_047-M-22-36-20140227-gen
OSBS.087.41.M.40.21.20140227    GTCGTGTAGCCT    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A7   OSBS_087-M-40-21-20140227-gen
OSBS.048.21.M.5.11.20140227 AGCGGAGGTTAG    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A8   OSBS_048-M-5-11-20140227-gen
OSBS.119.39.M.27.5.20140227 ATCCTTTGGTTC    CGGCTGCGTTCTTCATCGATGC  soil    Plate 1A9   OSBS_119-M-27-5-20140227-gen

Я хотел бы изменить имена geneticSampleID на Name и BarcodeSequence на Index1.Затем я хотел бы удалить все столбцы, кроме недавно названных столбцов Name и Index1.Мне бы хотелось, чтобы в первой строке файла оставались имена столбцов Name и Index1, перед которыми стоит символ #.Изменение имен столбцов достаточно просто в vim, удаление столбцов - нет.

Желаемый вывод:

#Index1 Name 
TCCCTTGTCTCC OSBS_087-M-32-18-20140227-gen
ACGAGACTGATT OSBS_048-M-37-33-20140227-gen
GCTGTACGGATT OSBS_048-M-15-31-20140227-gen
ATCACCAGGTGT OSBS_047-M-20-3-20140227-gen
TGGTCAACGATA OSBS_119-M-18-38-20140227-gen
ATCGCACAGTAA OSBS_047-M-22-36-20140227-gen
GTCGTGTAGCCT OSBS_087-M-40-21-20140227-gen
AGCGGAGGTTAG OSBS_048-M-5-11-20140227-gen
ATCCTTTGGTTC OSBS_119-M-27-5-20140227-gen

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Вы можете использовать один awk, например:

awk 'BEGIN{FS=OFS="\t"; print "Index1", "Name"} NR>1{print $2, $6}' file

Код Демо

Выход:

Index1  Name
TCCCTTGTCTCC    OSBS_087-M-32-18-20140227-gen
ACGAGACTGATT    OSBS_048-M-37-33-20140227-gen
GCTGTACGGATT    OSBS_048-M-15-31-20140227-gen
ATCACCAGGTGT    OSBS_047-M-20-3-20140227-gen
TGGTCAACGATA    OSBS_119-M-18-38-20140227-gen
ATCGCACAGTAA    OSBS_047-M-22-36-20140227-gen
GTCGTGTAGCCT    OSBS_087-M-40-21-20140227-gen
AGCGGAGGTTAG    OSBS_048-M-5-11-20140227-gen
ATCCTTTGGTTC    OSBS_119-M-27-5-20140227-gen
0 голосов
/ 18 октября 2018
cut -f2,6 inputfile | sed '1{ s/geneticSampleID/Name/; s/BarcodeSequence/Index1/; s/^/#/; }'
  1. Вырезать только фильтры столбцы 2 и 6
  2. Sed замещенный генетическийSampleId для имени s/.../.../ и BarcodeSeuqnce для индекса, но только для первой строки 1{ .. }
  3. Также sed добавляет предшествующий символ # s/^/#/
  4. Однажды я выучу awk!

Живая версия доступна на onlinegdb .

0 голосов
/ 18 октября 2018

Вы можете сделать это с помощью команд оболочки, таких как awk и sed, например:

cat map.txt | awk '{ print $2, $7}' | sed 's/BarcodeSequence/#Index1 Name/'

Вывод:

#Index1 Name 
TCCCTTGTCTCC OSBS_087-M-32-18-20140227-gen
ACGAGACTGATT OSBS_048-M-37-33-20140227-gen
GCTGTACGGATT OSBS_048-M-15-31-20140227-gen
ATCACCAGGTGT OSBS_047-M-20-3-20140227-gen
TGGTCAACGATA OSBS_119-M-18-38-20140227-gen
ATCGCACAGTAA OSBS_047-M-22-36-20140227-gen
GTCGTGTAGCCT OSBS_087-M-40-21-20140227-gen
AGCGGAGGTTAG OSBS_048-M-5-11-20140227-gen
ATCCTTTGGTTC OSBS_119-M-27-5-20140227-gen

Хотя сейчас мы используем sedзаменить одно имя столбца двумя новыми именами, и мне это кажется неприятным.Так что в этом случае я бы предпочел способ только для awk:

awk 'BEGIN{ print "#Name", "Index1"} NR>1 { print $2, $7}' map.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...