Для и если в скриптах 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
с собой (&
).