Добавление номеров поля - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть текстовый файл с несколькими строками и двумя или четырьмя столбцами.Если два столбца, то 1-й столбец - это идентификатор, а 2-й - это номер, а если четыре столбца: 1-й и 2-й - это идентификатор, а 3-й и 4-й - это номер.Для четырех строк столбцов ячейки 2-го и 4-го столбцов могут иметь несколько записей, разделенных запятой.Если есть только два столбца, я хочу напечатать их как есть;но если есть четыре столбца, я хочу напечатать только идентификатор 1-го столбца, а во втором столбце мне нужна сумма всех чисел, присутствующих в 3-м и 4-м столбцах для этой строки.

Ввод

    CG  AT,AA,CA    17  1,1,1
    GT  14
    TB  AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT         552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
    TT  CG,GT,TA,GB 105 3,4,1,3

Ожидаемый результат

    CG  20
    GT  14
    TB  602
    TT  116

Ответы [ 2 ]

3 голосов
/ 27 апреля 2019

Если в текущем файле нет начальных пробелов, используйте $1 вместо $2.

$ awk -F '[ ,]+' '{for(i=1; i<=NF; i++) s+=$i; print $2, s; s=0}' <<EOF
    CG  AT,AA,CA    17  1,1,1
    GT  14
    TB  AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT         552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
    TT  CG,GT,TA,GB 105 3,4,1,3
EOF

CG 20
GT 14
TB 602
TT 116
  • -F '[ ,]+' означает «поля разделены одним или несколькими пробелами или запятыми».

  • Нет условия, связанного с {action}, поэтому оно будет выполняться в каждой строке.

  • NF - Количество полей, а $X относится к X-му полю.

  • Строки равны 0, поэтому мы можем просто добавить каждое поле вместе, чтобы получить сумму.

  • После того, как мы напечатаем первое непустое поле и нашу сумму, мы сбрасываем сумму для следующей строки.

1 голос
/ 27 апреля 2019

Вот решение, разработанное для того, чтобы максимально точно следовать вашей инструкции (без трюков с разделением полей, чтобы об этом было легко рассуждать):

awk '
    NF == 2 {
        print $1, $2
        next
    }
    NF == 4 {
        N = split($4, f, /,/)
        for (i = 1; i <= N; ++i)
            $3 += f[i]
        print $1, $3
    }'

Я заметил, что ваш раздел ввода содержит начальные пробелы. Если начальные пробелы действительно присутствуют (и не имеют значения), мы можем добавить начальный { sub(/^ +/, "") } к сценарию.

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