J'ai un fichier, f1.txt
:
ID Name
1 a
2 b
3 g
6 f
Le nombre d'espaces n'est pas fixe. Quelle est la meilleure façon de remplacer tous les espaces blancs par un seul espace tr
?
Voici ce que j'ai jusqu'à présent:
cat f1.txt | tr -d " "
Mais le résultat est:
IDName
1a
2b
3g
6f
Mais je veux que ça ressemble à ça:
ID Name
1 a
2 b
3 g
6 f
S'il vous plaît essayez d'éviter sed
.
sed
. Voulait savoir d'autres façonsRéponses:
Avec
tr
, utilisez l' options
queeze repeat:Ou vous pouvez utiliser une
awk
solution:Lorsque vous modifiez un champ dans l'enregistrement,
awk
reconstruisez$0
, prend tous les champs et les concaténer, séparés parOFS
un espace qui est un espace par défaut.Cela pressera des séquences d’espace et des tabulations (et éventuellement d’autres caractères blancs en fonction de la localisation et de l’implémentation de
awk
) dans un seul espace, mais supprimera également les espaces en début et en fin de chaque ligne.la source
awk
, il peut tout faire. Vous pouvez également accepter sa solution. Juste une chose: Gnouc pouvez-vous éventuellement expliquer ce que fait le format awk dans votre commande? De plus, pouvez-vous ajouter des tabulations / espaces afin que la sortie soit conforme à la sortie attendue de Unknown?column -t
. Ajouter une explication pourawk
.tr
remplacera deux espaces à la fin d'une ligne par un seul espace.awk
va supprimer tous les espaces de fin.Il suffit d'utiliser
column
:Sortie:
la source
column -t f1.txt | cut -d " " -f2
mais ce n'était pas une solution à laquelle je m'attendaiscolumn -t file | awk '{print $2}'
Si vous voulez utiliser "l'espace blanc", vous voudrez utiliser les jeux de caractères prédéfinis de tr ": blank:" (onglet et espace d'espacement horizontal) ou ": space:" (espaces blancs réels):
Des exemples ont été exécutés sur Red Hat 5 (GNU tr).
Dans mon cas, je voulais normaliser tous les espaces blancs en un seul espace afin de pouvoir compter sur cet espace en tant que delmitter.
Comme l'a souligné le deuxième commentaire de dastrobu, j'ai raté le libellé de la page de manuel:
Cela nous permet d’éliminer le premier tr. Kudo est à la recherche de ses patients face à ma densité.
Avant, analyse du port de Redis config. fichier:
Après, avec SET2 étant spécifié avec le squeeze:
Sortie:
Pour plus de détails sur les nuances des espaces
Démontrez les cas où squeeze seul échoue lorsque des caractères mélangés successifs appartenant à la classe de caractères [: blank:] sont impliqués:
Remarque: Mes deux champs de chaîne au format printf sont séparés par 1 espace, 1 onglet, 1 espace. Après la compression, cette séquence existe toujours. Dans la sortie du vidage Octal, cela est représenté par la séquence ascii 040 011 040.
la source
tr "[:blank:]" " " | tr -s "[:blank:]"
? Je suppose que la première partie suffira, c'est-à-diretr "[:blank:]" " "
qu'elle normalise les espaces et effectue déjà la substitution. Extrait de la page de manuel: "Réduisez plusieurs occurrences des caractères [...] après la suppression et la traduction terminées."printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(comme suggéré par @dastrobu) et j'ai obtenuID Name\n
(avec un espace) en sortie. L'avez-vous réellement essayé, @ user3183018?printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"
(comme suggéré par @ Dastrobu), où␣
représente un espace, et j'aiID␣Name\n
(avec un espace) en sortie. Ceci est exactement le même que votre exemple de «Port <SPACE> <TAB> <SPACE> 6379», sauf que j'ai utilisé les chaînes de titre de la question. Je me demande si vous avez essayétr -s "[:blank:]"
(sans l'"␣"
argument final ).printf 'ID \t Name\n' | od -cb
, cela montre exactement ce que cela est supposé:I
D
\t
N
a
m
e
\n
(c.-àI
D
040
011
040
N
a
m
e
\n
-d.). Pendant ce temps, selon votre propre témoignage, vous faites exactement l'erreur que j'ai devinée: vous exécuteztr -s "[:blank:]"
(c'est-à-diretr
avec une option et un argument), au lieu de la commande que @dastrobu et moi avons présentée à quatre reprises maintenant:tr -s '[:blank:]' '␣'
(c'est-à-diretr
avec une option et deux arguments ).Qui a besoin d'un programme (autre que le shell)?
Si vous souhaitez aligner les valeurs de la deuxième colonne, comme dans la
column
réponse de polym , utilisezprintf
plutôtecho
:la source
tr
l’invocation de -, sans compter le travail supplémentaire que l’écriture nécessite. Enfin, ne diriez-vous pas que ce message ne répond pas réellement à la question posée? Quel est le meilleur moyen de remplacer tous les espaces blancs par un seul espace en utilisant seulement tr?$IFS
? Peut-être comme:IFS=' <tab>' set -f ; echo $(cat <file)
?Ceci est une vieille question et résolu à plusieurs reprises. Juste pour être complet: j'avais un problème similaire, mais je voulais faire passer des lignes par le biais d'un programme de canal à l'autre. J'ai utilisé xargs .
donc
cat f1.txt | xargs -L1
semble sortie exactement ce que vous voulez.la source