Substituir múltiplos espaços por um usando somente 'tr'

58

Eu tenho um arquivo, f1.txt :

ID     Name
1      a
2         b
3   g
6            f

O número de espaços não é corrigido. Qual é a melhor maneira de substituir todos os espaços em branco por um espaço usando apenas tr ?

Isso é o que eu tenho até agora:

cat f1.txt | tr -d " "

Mas a saída é:

IDName
1a
2b
3g
6f

Mas eu quero que seja assim:

ID Name
1 a
2 b
3 g
6 f

Por favor, tente evitar sed .

    
por gkmohit 22.07.2014 / 21:01

4 respostas

86

Com tr , use a s queeze opção de repetição:

$ tr -s " " < file
ID Name
1 a
2 b
3 g
6 f

Ou você pode usar uma solução awk :

$ awk '{$2=$2};1' file
ID Name
1 a
2 b
3 g
6 f

Quando você altera um campo no registro, awk rebuild $0 , toma todos os campos e concatina-os juntos, separados por OFS , que é um espaço por padrão.

Isso comprimirá seqüências de espaço e tabulações (e possivelmente outros caracteres em branco dependendo da localidade e implementação de awk ) em um espaço, mas também removerá os espaços em branco iniciais e finais de cada linha.

    
por 22.07.2014 / 21:06
17

Basta usar column :

column -t inputFile

Saída:

ID  Name
1   a
2   b
3   g
6   f
    
por 22.07.2014 / 21:03
6

Se você quiser espremer "espaço em branco", vai querer usar os conjuntos de caracteres predefinidos de tr: "blank:" (espaço e tabulação de espaço em branco horizontal) ou ": space:" (espaço em branco vertical):

/bin/echo -e  "val1\t\tval2   val3" | tr -s "[:blank:]"

Exemplos foram executados no Red Hat 5 (GNU tr).

No meu caso, eu queria normalizar todo o espaço em branco em um único espaço para poder contar com o espaço como um delimitador. Aqui estou analisando a porta da configuração do Redis. arquivo:

grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]"  | cut -d" " -f2

Saída:

6379

Para mais detalhes sobre as nuances do espaço em branco

    
por 14.06.2016 / 15:50
4

Quem precisa de um programa (além do shell)?

while read a b
do
    echo "$a $b"
done < f1.txt

Se você quiser que os valores na segunda coluna sejam alinhados, como na resposta column do polym, use printf em vez de echo :

while read a b
do
    printf '%-2s %s\n' "$a" "$b"
done < f1.txt
    
por 23.07.2014 / 01:33

Tags