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

путь:

awk '
    {
        if (NR!=FNR) {
            if (FNR==1) {
                printf "\t"
                for (i in arr){printf "%s\t", arr[i]}
                print ""
            }
            print
        }
        else{
            arr[c++]=$1
        }
    }
' file2 file1

1
26.12.2019, 16:48
3 ответа

Предполагая, что вкладка -разделяет данные:

$ awk -F '\t' -v OFS='\t' '{ sub("-.*", "", $9); print }' file
DRX154054       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL1    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/
DRX154053       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL2    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/
ERX3608304      ILLUMINA        SINGLE  ChIP-Seq        mm_Unknown_Unknown      Mus_musculus    None    No  EP1      NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/
DRX154052       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      DNMT3A  NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/

Это просто применяет замену к 9-му полю, которая удаляет все, начиная с первого символа тире в этом поле. Затем измененные данные распечатываются.

Регулярное выражение -.*будет соответствовать, начиная с первого -и далее (, буквально «соответствовать -, за которым следует ноль или более любых символов» ), и используя это с sub()и пустая строка замены в 9-м поле удаляет весь текст, соответствующий этому полю. Обратите внимание, что нам не нужно использовать здесь gsub(), так как нам нужно будет выполнять замену только один раз для каждой входной строки.

Поскольку мы модифицируем одно из полей, мы также должны убедиться, что разделитель полей вывода(OFS)установлен на символ табуляции, иначе мы получим поля, разделенные пробелом -в выводе. Очевидно, вы могли бы сделать это и с блоком BEGIN:

.
awk 'BEGIN { OFS=FS="\t" } { sub("-.*", "", $9); print }' file
1
27.01.2020, 23:40

Использование Миллера(https://github.com/johnkerl/miller)и запуск

mlr --tsv --implicit-csv-header --headerless-csv-output put '$9=gsub($9,"-.+$","")' input >output

у вас будет

+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
| 1          | 2        | 3      | 4        | 5                                      | 6            | 7    | 8  | 9      | 10 | 11 | 12 | 13                                                                                      |
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
| DRX154054  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | ELL1   | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  |
| DRX154053  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | ELL2   | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/  |
| ERX3608304 | ILLUMINA | SINGLE | ChIP-Seq | mm_Unknown_Unknown                     | Mus_musculus | None | No | EP1    | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ |
| DRX154052  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | DNMT3A | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  |
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
1
27.01.2020, 23:40

Использование substrиindex

awk -F '\t' '{$9=substr($9, 0, index($9, "-")-1); print}' input.lst > output.lst && mv output.lst input.lst
1
27.01.2020, 23:40

Теги

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