sed
não é a ferramenta certa para isso. Experimente awk
:
$ awk -v OFS='\t' 'NR==1{for (i=1;i<=NF;i++)if ($i=="ddd"){n=i-1;m=NF-(i==NF)}} {for(i=1;i<=NF;i+=1+(i==n))printf "%s%s",$i,i==m?ORS:OFS}' file
aaa bbb ccc eee fff
1 2 3 5 6
2 3 4 6 0
Isso pressupõe que a string a ser removida, ddd
nesse caso, aparece como um campo na primeira linha.
Como funciona
-
-v OFS='\t'
Isso define o separador de campo de saída como uma guia. Se você estiver usando outra coisa, mude isso.
-
NR==1{for (i=1;i<=NF;i++)if ($i=="ddd"){n=i-1;m=NF-(i==NF)}}
Isso varre todas as colunas na primeira linha. Nós salvamos o número da coluna com
ddd
(menos um) na variáveln
.Ele também define
m
para o número da última coluna, exceto no caso dei
ser a última coluna, caso em que ela é definida comoNF-1
. -
for(i=1;i<=NF;i+=1+(i==n))printf "%s%s",$i,i==m?ORS:OFS
Isso imprime cada campo, pulando o campo em que
ddd
apareceu na primeira linha.i+=1
aumentariai
em um em cada loop.i+=1+(i==n)
incrementai
em um em cada loop, exceto sei==n
, nesse caso,i
é incrementado em 2. Isso tem o efeito de pular a coluna da direita.printf "%s%s",$i,i==m?ORS:OFS
imprime colunai
seguido por um separador de coluna,OFS
ou um separador de linha,ORS
, dependendo sei
é a última coluna.
Várias linhas
Para aqueles que preferem comandos como este, escritos em várias linhas:
awk -v OFS='\t' '
NR==1{
for (i=1;i<=NF;i++)
if ($i=="ddd") {
n=i-1
m=NF-(i==NF)
}
}
{
for(i=1;i<=NF;i+=1+(i==n))
printf "%s%s",$i,i==m?ORS:OFS
}
' file
Usando arquivos separados por vírgulas
Se quisermos que a entrada e a saída sejam separadas por vírgula, precisamos alterar tanto o separador de campo de entrada (com -F
) quanto o separador de campo de saída. Por exemplo, considere este arquivo de entrada:
$ cat file2
aaa,bbb,ccc,ddd,eee,fff
1,2,3,4,5,6
2,3,4,5,6,0
Em seguida, use:
$ awk -F, -v OFS=, 'NR==1{for (i=1;i<=NF;i++)if ($i=="ddd"){n=i-1;m=NF-(i==NF)}} {for(i=1;i<=NF;i+=1+(i==n))printf "%s%s",$i,i==m?ORS:OFS}' file2
aaa,bbb,ccc,eee,fff
1,2,3,5,6
2,3,4,6,0