Ich habe einige Textdateien, die einige Spalten enthalten, die durch eine unterschiedliche Anzahl von Leerzeichen getrennt sind, aber stattdessen brauche ich einen einzelnen Tabulator als Trennzeichen. Ist das in Bash möglich?
Antwort1
Zum Konvertieren von Sequenzen vonmehr als ein Leerzeichenauf eine Registerkarte, abereinzelne Räume in Ruhe lassen:
sed 's/ \+ /\t/g' inputfile > outputfile
So tun Sie dies für mehrere Dateien:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
oder
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
oder
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
Verwenden Sie dieses Formular für MacOS (oder einfach um das Escapen +
in Linux zu vermeiden):
sed -E 's/ + /\t/g'
zusammen mit anderen Optionen usw., die Sie aus den obigen Beispielen benötigen.
Antwort2
Wenn Ihr Charakter über mehrere Registerkarten verfügt, können Sie auch Folgendes verwenden tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
Zum Beispiel:
my_file.txt | tr -s " "
Alle weißen Flächen werden zu einer.
Antwort3
Mit können Sie sed
mehrere Leerzeichen durch einen Tabulator ersetzen:
Beispiel zum Ersetzen eines oder mehrerer Leerzeichen durch einen Tabulator:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
Antwort4
Die einfachste Antwort, die nur die Verwendung von „only“ verwendet, bash
ist:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
Wenn die Anzahl der Spalten unterschiedlich ist, können Sie dies tun, es funktioniert jedoch nur in bash
, nicht in sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
z.B
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
erzeugt:
a b c
d e f
g h i
(dazwischen befindet sich jeweils ein Tabulator, der aber schwer zu erkennen ist, wenn ich ihn hier einfüge)
sed
Sie könnten dies auch mit oder tun tr
, beachten Sie jedoch, dass die Behandlung von Leerzeichen am Anfang zu unterschiedlichen Ergebnissen führt.
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i