У меня есть текстовый файл следующего формата:
5 3 1
2 3 4
.....
.....
т.е. 3 столбца чисел, разделенных пробелом/ Однако некоторые строки могут быть такими:
2
3 1
Итак, я хочу определить, есть ли в текстовом файле такие несоответствия, и распечатать их. Как мне это сделать?
решение1
awk 'NF != 3'
Это простой способ распечатать все строки, которые не имеют ровно три столбца. Если вы также хотите, чтобы команда возвращала статус сбоя, если такая строка найдена:
awk 'NF != 3 {print; ++bad} END {exit(!!bad)}'
Удалите print;
, чтобы ничего не печатать и только сообщать о наличии таких строк через статус выхода.
Вы также можете сделать это с помощью grep:
grep -Ev '^[^ ]+ +[^ ]+ +[^ ]+$'
Если вы хотите быть более строгим и вывести все строки, которые не состоят ровно из трех столбцов, каждый из которых содержит целое число:
grep -Ev '^([0-9]+) +([0-9]+) +([0-9]+)$'
Используйте [␉ ]+
вместо +
where ␉
символ табуляции, если вы хотите разрешить одну или несколько табуляций в качестве разделителей столбцов. Используйте, (␉| +)
чтобы разрешить либо ровно одну табуляцию, либо последовательность пробелов.
решение2
Если вы действительно хотите получить ответ, указанный в заголовке вопроса, эта awk
команда выведет номер строки и количество полей в каждой строке:
awk '{print NR,NF}'
решение3
awk '{if(NF != 3) print NR,NF}' file.txt
Это выведет номера строк в файле, в которых нет 3 полей, и количество полей, которые у них есть.