다양한 공백으로 구분된 일부 열을 포함하는 일부 텍스트 파일이 있지만 대신 구분 기호로 하나의 탭이 필요합니다. 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
only를 사용하는 가장 쉬운 대답 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