eu tenho a mesa
M - A A -
- A G - -
M - - - G
e quero realizar: se alguma coluna da primeira linha contiver "-", pule a impressão da coluna
A saída esperada é
M A A
- G -
M - -
ja tentei algo assim mas nao funcionou
awk 'NR==1 && $i!="-" {print $i}'
Alguém sabe como corrigir o comando?
Uma variação da resposta de Ed Morton , que lembra quais campos não estão
-
na primeira linha pelo número do campo e, em seguida, reformula cada registro na entrada de acordo com os índices salvos no arrayout
antes de imprimir o novo registro:Aqui, sacrifiquei um pouco de eficiência para facilitar a leitura, reconstruindo o registro em um loop separado, em vez de imprimir os campos obrigatórios em um único loop no segundo bloco.
Teste:
Executando com guias como separador de campo de saída:
Uma linha um pouco longa demais que depende dos dados de entrada serem delimitados por tabulação:
Isso é usado
awk
para gerar os números de campo que não estão-
na primeira linha como uma lista separada por vírgulas. Esta lista é então entregue acut -f
quem faz a saída real dos dados do arquivo. Observe que o nome do arquivo (aqui simplesmentefile
) é fornecido duas vezes na linha de comando, uma vez paraawk
e novamente paracut
.awk
faz um loop implícito sobre registros de entrada (linhas) e arquivos, mas não campos que você deve fazer explicitamente. No seu caso, você precisa percorrer os campos na primeira linha (cabeçalho) para decidir quais colunas incluir e, em seguida, percorrer os campos em cada linha (cabeçalho e não cabeçalho) para incluir as colunas desejadas nessa linha.Você não está claro se deseja procurar campos de cabeçalho iguais a (a string) "-" ou que podem tê-lo como uma (sub)string . Eu também suponho que você tenha (todas) guias únicas como separadores de campo, não vários espaços que seriam mais tediosos (e não podem ser distinguidos visualmente de sua postagem).
Usando Perl.
Para a primeira linha, construa uma matriz
@A
de índices para os quais o campo não é traço.Então, para todas as linhas, incluindo a primeira, imprima apenas os campos
@F
cujos índices estão em@A
.Resultado:
Podemos fazer isso usando
sed
, embora o código esteja com GNU sed no modo regex estendido, mas isso é apenas uma cura para obackslashitis
.O método é criar um mapa da primeira linha. Os campos a serem mantidos são mapeados como x outros como um traço. Salve este mapa no porão.
Então, para todas as linhas, anexe este mapa e coloque um marcador no BOL.
Em um loop, continuamos excluindo o campo inicial da linha atual se vemos um \n- E avançamos o marcador para o próximo campo.
O loop termina quando este marcador colide com a nova linha entre a linha atual e o espaço de espera (devido ao comando G).
Resultados