awk: установить переменную, если условия не соответствуют - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь удалить все строки, в которых есть повторяющаяся запись первого столбца, а первый столбец короче указанной длины c. Для этого я использую приведенный ниже код.

awk -F':' '!seen[$1]++ && length($1)<=32' file-dup > file

Тестовый образец: (это делается с использованием соответствующего числа символов 10 вместо 32).

Ввод:

a:123:addf
ab:123:addf
a:123:addf
abc:123:addf
akjsalkdjalkd123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
aop:123:addf
akijh:123:addf
akijhkjsladjslkajdlkad:123:addf

Выход:

a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf

В основном выводятся все строки, соответствующие условию. Но если все строки соответствуют условию или нет, код возврата всегда равен 0, так как awk успешно выполняется.

Я хочу знать, не соответствует ли какая-либо строка в файле условию или все строки выполнил условие. Как и в случае ввода, как показано ниже, я хочу вернуть другое значение или установить некоторую переменную, потому что ни одна из строк не удовлетворяет условию.

a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf

Я могу в основном проверить номера строк исходного файла и новый файл и получите ответ. но

Можно ли вернуть другой код возврата в случае, если условие не соответствует или может быть установлена ​​переменная внутри самого awk, если условия не выполняются?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Попробуйте, я не проверял:

awk -F':' '!seen[$1]++ && length($1)<=32{c++;print $0 > "file"}END{print NR==c}' file-dup
  • использовал print > для перенаправления в целевой файл (file)
  • команда вернуть 1 (все строки соответствуют условию) или 0

Вы также можете не вносить никаких изменений в свою команду awk и запустить вторую команду, чтобы сравнить два файла (файл и файл- dup) чтобы определить, есть ли отфильтрованные строки.

1 голос
/ 23 апреля 2020

Используйте инструкцию выхода AWK в конце для управления кодом выхода:

awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file-dup > file

Демонстрация:

$ awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file-dup && echo OK || echo KO
a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf
KO
$ awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file && echo OK || echo KO
a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf
OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...