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