Linux에서 여러 탭과 공백을 하나의 새 줄로 바꾸시겠습니까?

Linux에서 여러 탭과 공백을 하나의 새 줄로 바꾸시겠습니까?

공백이 삽입된 단어 목록이 포함된 (잠재적으로 매우 큰) 텍스트 파일이 있다고 가정해 보겠습니다. 예를 들어 다음과 같을 수 있습니다.

Cat                           Dog
Soup                          Rat
Cass                          Audrey

다음과 같이 각 단어를 공백 없이 별도의 줄에 표시하고 싶습니다.

Cat
Dog
Soup
Rat
Cass
Audrey

간단히 tr -d " "다음과 같이 변경할 수 있습니다.

CatDog
SoupRat
CassAudrey

(그러나 그것은 내가 원하는 것이 아닙니다.)

어떤 유형의 공백이 이 단어를 구분하는지 모르므로 일반 ASCII 공백과 탭의 조합이라고 가정합니다. (전폭 공백이나 0폭과 같은 보이지 않는 유니코드 문자는 없다고 가정할 수 있습니다.) 당연히 이러한 단어는 존재하지 않습니다.포함하다공백이므로 "à la", "alma mater", "appleie", "at free" 및 "icecream"은 유효한 단어가 아닙니다.

단어에 "AC/DC", "add-on", "AT&T", "audio-video", "can't", "carbon-14"와 같은 알파벳이 아닌 문자(공백이 아님)가 포함될 수 있다고 가정합니다. , "jack-o'-lantern" ", "시어머니", "o'clock", "O'Reilly", "RS-232" 및 "3-D". 이상적으로 솔루션은 "Ångström", "Gödel", "naïve", "résumé" 및 "smörgåsbord"와 같은 비ASCII 문자를 허용해야 합니다.

trsed와 같은 일반적인 Unix/Linux 도구를 사용 하거나 들여쓰기된 단어를 유지(및 격리)하면서 이러한 공백을 모두 제거하려면 어떻게 해야 합니까 awk?

이 솔루션이 언급된 문제의 보다 일반적인 경우에도 효과가 있다면 좋을 것입니다. 즉, 두 개의 텍스트 열뿐만 아니라 다음과 같은 임의의 배열에도 적용됩니다.

          Once    upon
    a   midnight
                    dreary
while                     I pondered
       weak    and weary
           Over                many
a   quaint  and     curious     volume
 of forgotten lore

답변1

etopylight는 거의 옳습니다.

tr -s ' \t' '\n'

질문에서는 탭 교체도 요구하기 때문입니다.

답변2

기본적으로 GNU에서는 이 작업을 수행할 수 있습니다 sed.

sed 's/\s\+/\n/g'

그러면 그렇게 해...

답변3

당신은 사용할 수 있어야합니다

sed -e 's/[[:space:]]\{1,\}/\n/'

하나 이상의 공백 문자(폼 피드 및 수직 탭과 같은 홀수 문자 포함)의 시퀀스를 단일 개행 문자로 바꿉니다.

답변4

awk의 기본 동작은 이미 공백(공백, 탭) 수에 관계없이 분할하는 것이므로 해당 기능도 사용할 수 있습니다. 출력 필드 구분 기호를 "\n"으로 설정하고 $0를 다시 빌드하기만 하면 됩니다. 그러나 이 작업의 공개 질문 중 하나는 빈 줄을 어떻게 처리하시겠습니까?입니다.

그대로 인쇄하십시오.

awk -v OFS='\n' '{$1 = $1; print}' file

빈 줄을 추가로 필터링하려면 다음을 수행하세요.

awk -v OFS='\n' 'NF {$1 = $1; print}' file

(그러나 Linux 설정에서 Windows 줄 끝(\r 포함)에 유의하세요. awk는 반드시 \r이 있는 줄을 빈 줄로 처리하지 않으며, 이 경우 빈 줄도 출력됩니다. 따라서 다음에서 CRLF 첫 번째 텍스트 파일로 필터링하세요. 끝 dos2unix.

관련 정보