Eu tenho um arquivo f1.txt
:
ID Name
1 a
2 b
3 g
6 f
O número de espaços não é fixo. Qual é a melhor maneira de substituir todos os espaços em branco por um espaço usando apenas tr
?
Isto é o que eu tenho até agora:
cat f1.txt | tr -d " "
Mas a saída é:
IDName
1a
2b
3g
6f
Mas eu quero que fique assim:
ID Name
1 a
2 b
3 g
6 f
Por favor, tente e evite sed
.
sed
. Queria saber outras maneiras:)Respostas:
Com
tr
, use a opção de repetição dos
queeze :Ou você pode usar uma
awk
solução:Quando você altera um campo no registro,
awk
reconstrói$0
, pega todos os campos e os concatena, separados porOFS
, que é um espaço por padrão.Isso comprime seqüências de espaço e guias (e possivelmente outros caracteres em branco, dependendo do local e da implementação de
awk
) em um espaço, mas também remove os espaços em branco à esquerda e à direita de cada linha.fonte
awk
, ele pode fazer qualquer coisa. Você também pode aceitar a solução dele. Apenas uma coisa: o Gnouc pode explicar o que o formato awk no seu comando faz? Também é possível adicionar tabulações / espaços para que a saída esteja em conformidade com a saída esperada do Unknown?column -t
faz. Adicione explicações paraawk
.tr
substituirá dois espaços no final de uma linha por um único espaço.awk
removerá todos os espaços à direita.Basta usar
column
:Resultado:
fonte
column -t f1.txt | cut -d " " -f2
, mas não foi uma solução que eu esperavacolumn -t file | awk '{print $2}'
imprime apenas a segunda colunaSe você deseja espremer "espaço em branco", desejará usar os conjuntos de caracteres predefinidos do tr ": blank:" (guia e espaço em branco do espaço horizontal) ou ": space:" (espaço em branco vertical):
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 confiar no espaço como delmitter.
Como apontado pelo segundo comentário de dastrobu, perdi o texto na página de manual:
Isso nos permite eliminar o primeiro tr. Kudo deve procurar suas paciências em face da minha densidade.
Antes, analisando a porta da configuração do Redis. Arquivo:
Depois, com SET2 sendo especificado com o aperto:
Resultado:
Para mais detalhes sobre as nuances do espaço em branco
Demonstre onde o aperto sozinho falha quando caracteres mistos sucessivos que se enquadram na classe de caracteres [: blank:] estão envolvidos:
Nota: Meus dois campos de sequência no formato printf são separados por 1 espaço, 1 guia, 1 espaço. Após o aperto, essa sequência ainda existe. Na saída do dump Octal, isso é representado pela sequência ascii 040 011 040.
fonte
tr "[:blank:]" " " | tr -s "[:blank:]"
? Eu acho que a primeira parte será suficiente, ou seja,tr "[:blank:]" " "
uma vez que normaliza os espaços em branco e já faz a substituição. Na página do manual: "Aperte várias ocorrências dos caracteres [...] Isso ocorre depois que todas as exclusões e traduções são concluídas."printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(como sugerido por @dastrobu) e recebiID Name\n
(com um espaço) como saída. Você realmente tentou, @ user3183018?printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"
(como sugerido por @dastrobu), onde␣
representa um espaço, e recebiID␣Name\n
(com um espaço) como saída. É exatamente o mesmo que o seu exemplo de "Porta <ESPAÇO> <TAB> <ESPAÇO> 6379", exceto que eu usei as cadeias de título da pergunta. Gostaria de saber se você tentoutr -s "[:blank:]"
(sem o"␣"
argumento final ).printf 'ID \t Name\n' | od -cb
, mostra exatamente o que deveria:I
D
\t
N
a
m
e
\n
(ie,I
D
040
011
040
N
a
m
e
\n
). Enquanto isso, por sua própria evidência, você está cometendo exatamente o erro que eu imaginei: você está executandotr -s "[:blank:]"
(ou seja,tr
com uma opção e um argumento), em vez do comando que @dastrobu e eu apresentamos quatro vezes agora:tr -s '[:blank:]' '␣'
(ou seja,tr
com uma opção e dois argumentos ).Quem precisa de um programa (além do shell)?
Se você deseja alinhar os valores na segunda coluna, como na
column
resposta da polym , use emprintf
vez deecho
:fonte
tr
invocação - que não é mencionar quanto mais trabalho é necessário para escrever. Por fim, você não diria que este post não responde realmente à pergunta conforme solicitado? Qual é a melhor maneira de substituir todos os espaços em branco por um espaço usando apenas tr?$IFS
? Talvez comoIFS=' <tab>' set -f ; echo $(cat <file)
:?Esta é uma pergunta antiga e resolvida muitas vezes. Só para completar: eu tive um problema semelhante, mas queria passar linhas através de um canal para outro programa. Eu usei xargs .
então
cat f1.txt | xargs -L1
parece produzir exatamente o que você deseja.fonte