さまざまな数のスペースで区切られた列を含むテキスト ファイルがいくつかありますが、区切り文字としてタブが 1 つ必要です。Bash で実行できますか?
答え1
シーケンスを変換するには複数のスペースタブに、しかし個々のスペースをそのままにしておく:
sed 's/ \+ /\t/g' inputfile > outputfile
複数のファイルに対してこれを行うには:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
または
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
または
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
+
MacOS の場合はこの形式を使用します (または、 Linux でエスケープを回避するには、次のようにします)。
sed -E 's/ + /\t/g'
上記の例から必要なその他のオプションなど。
答え2
キャラクターが複数のタブの場合は、以下も使用できますtr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
例えば:
my_file.txt | tr -s " "
すべての空白が 1 つになります。
答え3
sed
複数のスペースをタブに置き換えるには、を使用します。
1 つ以上のスペースを 1 つのタブに置き換える例:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
答え4
のみを使用した最も簡単な答えは次のbash
とおりです。
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
列数が可変の場合、これを行うことができますが、 でのみ機能しbash
、 では機能しませんsh
。
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
例えば
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
生成:
a b c
d e f
g h i
(それぞれの間にタブがありますが、ここに貼り付けると見えにくいです)
sed
またはを使用してこれを行うこともできますtr
が、先頭の空白の処理によって結果が異なることに注意してください。
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 -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i