Outro awk
:
$ awk -F, '!length($5)' file
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;
Eu tenho que verificar se o quinto campo está vazio em um arquivo CSV. Este é o meu arquivo:
1,abc,543,87,DATA,fsg;
1,abc,543,87,,fsg;
1,abc,543,87,DATA,fsg;
1,abc,543,88,,fsg;
1,abc,543,,DATA,fsg;
Como você pode ver, a segunda e quarta linhas têm um quinto campo vazio. Eu quero imprimir todas essas linhas.
O resultado deve ser este:
1,abc,543,87,,fsg;
1,abc,543,87,,fsg;
Outro awk
:
$ awk -F, '!length($5)' file
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;
Você pode usar um separador de campo diferente (por espaço padrão) com a opção -F
e, em seguida, só precisa verificar se a quinta coluna está vazia:
awk -F',' '{if($5==""){print $0}' myfile
ou mais concisa:
awk -F, '$5==""' myfile
-
E com o comando sed:
sed -n '/,,[^,]*$/p' myfile
Não imprima ( -n
), exceto se estiver coincidindo com /,,[^,]*$/
, que termina ( ...$
) com ,,
(5º campo vazio) + um 6º campo que não contém ,
( [^,]
= tudo, exceto uma vírgula.
Observe que, se você tiver mais de 6 campos, o comando não funcionará como esperado.
Um awk
simples seria suficiente:
awk -F, '$5==""' your_file
Explicação
,
( -F ,
) awk
é imprimir o registro atual. Nós garantimos que isso só acontece quando o quinto campo está em branco ( $5 == ""
) Com grep
(como solicitado):
grep -e '.*,.*,.*,.*,,' input
embora isso corresponda a linhas com campos vazios após o quinto
Você pode usar o comando awk
:
$ awk '/^(.*,){4},.*/' filename
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;
O teste regular de qualquer caractere seguido por um ,
quatro vezes, e depois o próximo caractere deve ser outro ,
(quinto campo em branco) seguido por qualquer coisa.
Uma solução Pythonica:
python3 -c 'import sys, csv; csv.writer(sys.stdout).writerows(filter(lambda record: record[4] == "", csv.reader(sys.stdin)))' < input.csv
csv
, analisamos stdin
e filtramos qualquer linha que tenha um quinto elemento vazio (índice 4, pois indexamos de 0). csv
para stdout
. com sed
talvez:
sed -n 's/,/,\n/4;s/\n,/,/p'
Ou até mesmo:
sed -n '/^\([^,]*,\)\{4\},/p'
O acima também deve funcionar para qualquer grep
- apenas deixe os bits antes e depois de /
chars. Em alguns sed
s, você pode querer uma nova linha literal em vez de n
na primeira s///
ubstitution.
você também pode encontrar o valor nulo para a quinta coluna na lista de arquivos (BULK OF FILE) e imprimir o registro com o nome do arquivo.
awk -F',' '$5 == "" {printf FILENAME"="$0"\n"}' *common_filepattern*
explicação:
-F,
definiu limite de campo para $5 ==""
é a coluna 5 para nulo FILENAME
= nome do arquivo é a palavra-chave para imprimir o nome do arquivo Tags bash text-processing awk