我有一些文字文件,其中包含一些由不同數量的空格分隔的列,但我需要一個選項卡作為分隔符號。在 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 " "
所有的空白都將合而為一。
答案3
您可以使用sed
製表符替換多個空格:
用一個製表符取代一個或多個空格的範例:
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:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i