Ich habe eine Akte f1.txt
:
ID Name
1 a
2 b
3 g
6 f
Die Anzahl der Leerzeichen ist nicht festgelegt. Was ist der beste Weg, um alle Leerzeichen mit nur einem Leerzeichen zu ersetzen tr
?
Das habe ich bisher:
cat f1.txt | tr -d " "
Aber die Ausgabe ist:
IDName
1a
2b
3g
6f
Aber ich möchte, dass es so aussieht:
ID Name
1 a
2 b
3 g
6 f
Bitte versuchen Sie es zu vermeiden sed
.
sed
.Antworten:
Mit
tr
Verwenden Sie dies
queeze Wiederholungsoption:Oder Sie können eine
awk
Lösung verwenden:Wenn Sie ein Feld in einem Datensatz ändern, erstellen Sie es
awk
neu$0
, nehmen Sie alle Felder und verknüpfen Sie sie, getrennt durchOFS
, wobei es sich standardmäßig um ein Leerzeichen handelt.Dadurch werden Abfolgen von Leerzeichen und Tabulatoren (und möglicherweise andere Leerzeichen, je nach Gebietsschema und Implementierung von
awk
) in einem Leerzeichen zusammengefasst, aber auch die führenden und nachfolgenden Leerzeichen in jeder Zeile entfernt.quelle
awk
alles kann, was er braucht . Sie können auch seine Lösung akzeptieren. Nur eine Sache: Gnouc können Sie möglicherweise erklären, was das awk-Format in Ihrem Befehl bewirkt? Können Sie auch Tabulatoren / Leerzeichen hinzufügen, damit die Ausgabe der erwarteten Ausgabe von Unknown entspricht?column -t
es ausgegeben wird. Erklärung für hinzufügenawk
.tr
ersetzt zwei Leerzeichen am Ende einer Zeile durch ein einzelnes Leerzeichen.awk
entfernt alle nachgestellten Leerzeichen.Verwenden Sie einfach
column
:Ausgabe:
quelle
column -t f1.txt | cut -d " " -f2
aber es war keine Lösung, die ich erwartet hattecolumn -t file | awk '{print $2}'
druckt nur die zweite SpalteWenn Sie "Leerzeichen" ausdrücken möchten, müssen Sie die vordefinierten Zeichensätze von tr verwenden: ": Leerzeichen:" (horizontale Leertaste und Leerzeichen) oder ": Leerzeichen:" (verisches Leerzeichen):
Beispiele wurden unter Red Hat 5 (GNU tr) ausgeführt.
In meinem Fall wollte ich alle Leerzeichen auf ein einzelnes Leerzeichen normieren, damit ich mich auf das Leerzeichen als Delmitter verlassen konnte.
Wie in Dastrobus zweitem Kommentar hervorgehoben, habe ich den Wortlaut in der Manpage verpasst:
Dies ermöglicht es uns, den ersten tr zu eliminieren. Kudo muss angesichts meiner Dichte nach seiner Geduld suchen.
Vorher Parsing-Port von Redis Config. Datei:
Danach wird SET2 mit squeeze angegeben:
Ausgabe:
Weitere Informationen zu den Weißraum-Nuancen
Zeigen Sie, wo Squeeze alleine fehlschlägt, wenn aufeinanderfolgende gemischte Zeichen der Zeichenklasse [: blank:] beteiligt sind:
Hinweis: Meine zwei Zeichenkettenfelder im printf-Format sind durch 1 Leerzeichen, 1 Tabulator, 1 Leerzeichen getrennt. Nach dem Auspressen ist diese Reihenfolge noch vorhanden. In der Ausgabe des Octal-Dumps wird dies durch die ASCII-Sequenz 040 011 040 dargestellt.
quelle
tr "[:blank:]" " " | tr -s "[:blank:]"
? Ich denke, der erste Teil wird ausreichen, dhtr "[:blank:]" " "
da er Leerzeichen normalisiert und die Substitution bereits vornimmt. Aus der Manpage: "Drücken Sie die Zeichen mehrmals zusammen, [...] nachdem alle Lösch- und Übersetzungsvorgänge abgeschlossen sind."printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(wie von @dastrobu vorgeschlagen) und ich habeID Name\n
(mit einem Leerzeichen) als Ausgabe bekommen. Hast du es tatsächlich versucht, @ user3183018?printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"
(wie von @dastrobu vorgeschlagen), wo␣
ein Leerzeichen darstellt, und ich bekamID␣Name\n
(mit einem Leerzeichen) als Ausgabe. Dies ist genau das gleiche wie in Ihrem Beispiel für "Port <SPACE> <TAB> <SPACE> 6379", außer dass ich die Überschriften aus der Frage verwendet habe. Ich frage mich, ob Sie es versucht habentr -s "[:blank:]"
(ohne das letzte"␣"
Argument).printf 'ID \t Name\n' | od -cb
, zeigt es genau, was es soll:I
D
\t
N
a
m
e
\n
(dhI
D
040
011
040
N
a
m
e
\n
). In der Zwischenzeit machen Sie nach eigenen Angaben genau den Fehler, den ich vermutet habe: Sie führen austr -s "[:blank:]"
(dhtr
mit einer Option und einem Argument), anstelle des Befehls, den @dastrobu und ich jetzt viermal angegeben haben:tr -s '[:blank:]' '␣'
(dhtr
mit einer Option und zwei Argumenten ).Wer braucht ein Programm (außer der Shell)?
Wenn Sie möchten, dass die Werte in der zweiten Spalte wie in der
column
Antwort von polym angezeigt werden , verwenden Sieprintf
anstelle vonecho
:quelle
tr
den Aufruf zu überwiegen - was nicht zu erwähnen ist, wie viel Arbeit das Schreiben erfordert . Zuletzt, würden Sie nicht sagen, dass dieser Beitrag die gestellte Frage nicht wirklich beantwortet? Was ist der beste Weg, um alle Leerzeichen mit nur tr durch ein Leerzeichen zu ersetzen?$IFS
? Vielleicht mag:IFS=' <tab>' set -f ; echo $(cat <file)
?Dies ist eine alte Frage und oft gelöst. Der Vollständigkeit halber: Ich hatte ein ähnliches Problem, wollte aber Leitungen per Pipe an ein anderes Programm übergeben. Ich habe Xargs benutzt .
also
cat f1.txt | xargs -L1
scheint genau das auszugeben was du willst.quelle