Для и если в скриптах Awk (bash)

Моя команда bash

awk -f code.txt input.txt

Это мой код

{z=0
for(i=2;i<17;i++)
    if ($i=="y")
        z++
print $1 " " z}

Это мой вклад

AaA y n y n y n n n y n n n n n y
BbB n y y n n n n n n n n n n n n

Мой вывод должен быть

AaA 5
BbB 2

Все же это

AaA 4
BbB 2

Кажется, что после того, как он возился с кодом, он не регистрирует последний символ строки.

{z=0
for(i=2;i<18;i++)
        print $i
print $1 " " z}

Когда я запускаю это, он выводит все y / n, поэтому проблема должна быть где-то в операторе if.

2 ответа

Решение

Это может быть случай, когда ваш входной файл имеет окончания строки MS-DOS (CRLF). Последний символ будет читаться как y<CR>, Чтобы проверить, так ли это, в системе Linux вы можете запустить

hexdump -C input.txt

Проблема, казалось, была в CRLF, Вы можете исправить это в цикле awk с помощью

sub(/\r/,"",$NF)

то есть. удалив CR (заменить ничем) из последнего поля. Кроме того, вы можете использовать это sub или же gsub для подсчета y вхождения:

$ awk '$0=$1 OFS gsub(FS "y","&")' file
AaA 5
BbB 2

Таким образом, \r не имеет значения, так как мы просто заменим y с собой (&).

Другие вопросы по тегам