Como deletar espaços das linhas selecionadas

3

Eu tenho um pequeno problema no Linux com a remoção de espaços de linhas selecionadas do meu arquivo.

Por exemplo:

f h t s q e g h c h t
f h t r f h v f d g n
q a z x s w e d c v f
f h b c h t h b v h f
p l k o i j u h y g t
t f r d c v b h n j u

e agora, como devo excluir espaços das linhas 2, 4 e 5? Além disso, como vai procurar a terceira linha?

    
por warszawiaczek 08.10.2015 / 22:38

5 respostas

6

Usando o awk

Para remover espaços em branco das linhas 2, 4 e 5:

$ awk 'NR==2 || NR==4 || NR==5 {gsub(/ /,"");} 1' file 
f h t s q e g h c h t
fhtrfhvfdgn
q a z x s w e d c v f
fhbchthbvhf
plkoijuhygt
t f r d c v b h n j u

No awk, NR é o número da linha. A expressão lógica NR==2 || NR==4 || NR==5 seleciona as linhas de interesse para você. O comando gsub(/ /,"") remove espaços em branco dessas linhas. A condição 1 é a abreviação enigmática do awk para imprimir a linha.

Usando sed

Para remover espaços em branco das linhas 2, 4 e 5:

$ sed '3n; 2,5 s/ //g' file 
f h t s q e g h c h t
fhtrfhvfdgn
q a z x s w e d c v f
fhbchthbvhf
plkoijuhygt
t f r d c v b h n j u

Aqui, usamos uma lógica ligeiramente diferente: removemos espaços em branco para todas as linhas de 2 a 5, exceto a linha 3. Isso funciona da seguinte maneira: a expressão 3n informa que, quando se trata da linha 3, imprima e pule para a próxima linha. Caso contrário, o comando '2,5 s / // g diz ao sed para remover os espaços em branco de todas as linhas de 2 a 5.

Para remover todo o espaço em branco, não apenas os espaços em branco

awk 'NR==2 || NR==4 || NR==5 {gsub(/[[:space:]]/,"");} 1' file

Ou:

sed '3n; 2,5 s/[[:space:]]//g' file
    
por 08.10.2015 / 22:42
5

Outra variante para awk

awk 'NR~/^[245]$/{$1=$1}1' OFS='' file
    
por 08.10.2015 / 22:51
2

Você poderia fazer isso com um shell. Pode até valer a pena fazer isso em alguns casos. Provavelmente não com frequência, no entanto.

sh -fc  <in >out '
    for IFS do read -r l
        printf %s $l;echo
    done; exec cat
' -- '' \  '' \  \ 
f h t s q e g h c h t
fhtrfhvfdgn
q a z x s w e d c v f
fhbchthbvhf
plkoijuhygt
t f r d c v b h n j u
    
por 09.10.2015 / 01:46
0

Com :

perl -lpe 'grep { /^$.$/ } (2,4,5) and s/\s//g'

ou com o operador de smartmatch experimental :

perl -lpe '$. ~~ [2,4,5] and s/\s//g'

Com :

awk 'NR==2 || NR==4 || NR==5{gsub(/\s/, "")} 1' file

Saída:

 f h t s q e g h c h t
fhtrfhvfdgn
 q a z x s w e d c v f
fhbchthbvhf
plkoijuhygt
 t f r d c v b h n j u
    
por 08.10.2015 / 22:47
0

Alguém precisa representar 'tr' corretamente, declarar uma solução, então aqui vai:

 tr -d [:space:]

OR

 tr -d [:blank:]

Supondo que a fonte de texto é um arquivo chamado ich:

 cat ich | tr -d [:space:]

Isso produz uma linha, sem espaço:

fhtsqeghchtfhtrfhvfdgnqazxswedcvffhbchthbvhfplkoijuhygttfrdcvbhnju

Se você deseja preservar as linhas, use essa variante:

 cat ./ich | tr -d [:blank:]

que produz esta saída (menos a nova linha extra entre as linhas)

fhtsqeghcht

fhtrfhvfdgn

qazxswedcvf

fhbchthbvhf

plkoijuhygt

tfrdcvbhnju

Respostas brilhantes, meus estimados colegas, todos e cada um!

F.

    
por 09.10.2015 / 02:02