さまざまな数のスペースで区切られたいくつかの列を含むテキストファイルがありますが、代わりにセパレータとして1つのタブが必要です。Bashで行うことは可能ですか?
さまざまな数のスペースで区切られたいくつかの列を含むテキストファイルがありますが、代わりにセパレータとして1つのタブが必要です。Bashで行うことは可能ですか?
回答:
複数のスペースのシーケンスをタブに変換するが、個々のスペースをそのままにする場合:
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' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
下部に1。
sed
は、バックアップ拡張機能の前にスペースを入れることを好みません。回答を編集しました。報告いただきありがとうございます。
あなたのキャラクターが複数のタブであれば、あなたも使用することができます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つになります。
を使用sed
して、いくつかのスペースをタブに置き換えることができます。
1つ以上のスペースを1つのタブに置き換える例:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
のみを使用して最も簡単な答え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:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
perl -p -i -e 's/\s+/\t/g' *.txt
これは非常に簡単なソリューションです。
sed -E 's/\s+/\t/g' your_file > new_file
sedは基本的にこの方法で機能します(sed 's / old_pattern / new_pattern / g')。この場合、古いパターンは「\ s +」です。これは、スペース「s」を1回以上検索し、「+」とバックスラッシュ「\」で正規表現として解釈することを意味します。
新しいパターンはタブ「\ t」であり、これは正規表現形式で記述され、「g」はすべての行に置換を「グローバルに」適用します。