Eu tenho um arquivo de texto com o seguinte formato:
5 3 1
2 3 4
.....
.....
ou seja, 3 colunas de números separadas por espaço/ No entanto, algumas das linhas podem ser como:
2
3 1
Então, quero detectar se o arquivo de texto possui algum desses inconsistências e imprimi-las. Como eu faço isso?
Responder1
awk 'NF != 3'
Esta é uma forma simples de imprimir todas as linhas que não possuem exatamente três colunas. Se você também quiser que o comando retorne um status de falha se alguma linha desse tipo for encontrada:
awk 'NF != 3 {print; ++bad} END {exit(!!bad)}'
Remova print;
para não imprimir nada e apenas reportar a presença de tais linhas através do status de saída.
Você também pode fazer isso com grep:
grep -Ev '^[^ ]+ +[^ ]+ +[^ ]+$'
Se você quiser ser mais rigoroso e imprimir todas as linhas que não consistem exatamente em três colunas, cada uma contendo um número inteiro:
grep -Ev '^([0-9]+) +([0-9]+) +([0-9]+)$'
Use [␉ ]+
em vez de +
onde ␉
está um caractere de tabulação se desejar permitir uma ou mais tabulações como separadores de coluna. Use (␉| +)
para permitir exatamente uma tabulação ou uma sequência de espaços.
Responder2
Caso o que você realmente queira seja o que está escrito no título da sua pergunta, este awk
comando irá imprimir o número da linha e o número de campos em cada linha:
awk '{print NR,NF}'
Responder3
awk '{if(NF != 3) print NR,NF}' file.txt
Isso imprimirá os números das linhas do arquivo que não possuem 3 campos e o número de campos que eles possuem.