![다른 줄의 단어를 한 줄로 결합](https://linux55.com/image/200575/%EB%8B%A4%EB%A5%B8%20%EC%A4%84%EC%9D%98%20%EB%8B%A8%EC%96%B4%EB%A5%BC%20%ED%95%9C%20%EC%A4%84%EB%A1%9C%20%EA%B2%B0%ED%95%A9.png)
서로 아래에 있는 단어 목록이 포함된 파일이 있습니다. 여기서 단어는 한 문장에 속하고 다음 문장에 속한 단어도 서로 아래에 있습니다. 아래 표현 #2에 표시된 것처럼 문장과 관련된 단어 블록 뒤에 공백이 옵니다.
예상 출력: (#1을 의미):
These are the words for sentence 1
These are the words for sentence 2
예상 입력: (#2의 경우):
These
are
the
words
for
sentence 1
these
are
the
words
for
sentence 2
나는 따라가려고 노력한다이 문제그런데 문장마다 다른 단어를 사용하면 동작하지 않는데, 리눅스에서 표현번호 2를 표현번호 1로 어떻게 바꿀 수 있나요?
답변1
$ awk -v RS= '{$1=$1}1' file
These are the words for sentence 1
these are the words for sentence 2
답변2
awk를 사용하세요:
awk 'BEGIN { RS = "" } {gsub(/ *\n */, " "); print}' FILE
답변3
정규식 모드에서 GNU sed 편집기를 확장하고 예약된 공간을 사용하여 비어 있지 않은 줄을 저장합니다.
sed -Ee 's/^\s+|\s+$//g
/./{H;$!d;}
x;s/.//;y/\n/ /
' file
또 다른 방법은 awk 예약어를 사용하는 것입니다.
awk -v RS= '
BEGIN{FS=ORS}
{$1=$1}1
' file
답변4
$ perl -00 -aE 'say join " ", @F' input.txt
These are the words for sentence 1
these are the words for sentence 2
-00
Perl에게 단락 모드에서 파일을 읽도록 지시합니다(단락은 하나 이상의 빈 줄로 구분됩니다).-a
Perl에게 입력을 공백의 배열로 자동 분할하도록 지시합니다@F
(awk가 입력을 자동으로 $1, $2, $3 등으로 분할하는 방법과 유사).-a
이 옵션은 또한 암시적으로 설정되어-n
Perl이 다음과 같이 동작하도록 합니다sed -n
(자동으로 인쇄하지 않고 모든 입력 읽기).-p
이 옵션(-n 없이 sed와 같이 수정될 수 있는 입력을 자동으로 인쇄)은 명령줄에 옵션을 추가하여 무시할 수 있습니다 .-E
인쇄 후 자동으로 새 줄을 추가하는 기능 과 같은 스크립트의 모든 선택적 기능을 활성화하는 것이 조금 더 쉽습니다(say
대신 사용하는 경우print join(" ", @F), "\n"
이 작업을 수행해야 합니다 ).-e
-E
say
Perl은 오랫동안 사용되어 왔으며 기본적으로 활성화되어야 하지만 Perl 개발자는say
자체 기능을 정의하는 오래된 스크립트가 손상될 위험 때문에 수십 년 전에 그렇게 하지 않기로 결정했습니다.이
join()
함수는 배열 요소를@F
공백으로 연결합니다.
또는 대신 출력 필드 구분 기호( $,
)를 설정할 수 있습니다 join
.
$ perl -00 -aE 'BEGIN{$,=" "}; say @F' input.txt
These are the words for sentence 1
these are the words for sentence 2
기본 OFS가 공백 문자인 awk와 달리 Perl의 기본 OFS는 비어 있고 정의되지 않습니다. 그러면 단어 사이에 공백 없이 배열이 인쇄됩니다.
$ perl -00 -aE 'say @F' input.txt
Thesearethewordsforsentence1
thesearethewordsforsentence2
정확히 당신이 원하는 것이 아닙니다.