повторить awk и if для всех столбцов - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть файл с более чем 50 столбцами, и я хотел бы вывести только поля с последним символом, равным 1 во всех столбцах. Как сделать l oop оператор if, показанный ниже для всех столбцов?

awk '{if(substr($0,length($0),1) == 1) print $0}' file_with_one_column.tsv 

дополнительная информация: (1) разделитель: символ табуляции (2): то же количество столбцов, что и для ввода (исключая поля с последним символом! = 1). т.е. не одна строка output (3) одинаковое количество строк во всех столбцах (4) проблема: некоторые поля содержат только '.' charachter.

У меня возникает эта проблема, когда я пытался использовать цикл awk: 1: unexpected character '.'

Пример ввода:

ENSG00000267601.1    ENSG00000256861.1    ENSG00000259953.2
DGCR8_H_2_2          .                    SAFB2_K_1_2
IGF2BP3_H_1_1        DDX6_K_1_2           LIN28B_H_1_2
NKRF_H_2_2           PPIL4_K_2_2          LIN28B_K_1_1
IGF2BP1_H_2_2        CDC40_H_1_2          LIN28B_K_2_1
POLR2G_H_2_2         IGF2BP3_H_1_2        .

Требуемый вывод:

ENSG00000267601.1    ENSG00000256861.1    ENSG00000259953.2
IGF2BP3_H_1_1                             LIN28B_K_1_1
                                          LIN28B_K_2_1

1 Ответ

1 голос
/ 17 февраля 2020

Вот так:

awk '{for(i=1;i<=NF;i++){if(substr($i,length($i),1)=="1") print $i}}' file.tsv

Это печатает каждое поле на отдельной строке.

Если вы хотите отфильтровать строки и распечатать только те столбцы, которые заканчиваются на 1, вы можете использовать:

#!/bin/bash
awk '{
    found = 0
    for(i=1;i<=NF;i++){
        if(substr($i,length($i),1) == "1") {
            printf "%s%s", (found?OFS:""), $i
            found = 1
        }
    }
    if(found) {
        printf "%s", ORS
    }
}' file.tsv

Кстати, если ваш входной файл не очень большой, я бы назвал проверку substr($i,length($i),1) == "1" микрооптимизацией и заменил бы ее более читаемым регулярным выражением $i ~ /1$/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...