다른 줄의 단어를 한 줄로 결합

다른 줄의 단어를 한 줄로 결합

서로 아래에 있는 단어 목록이 포함된 파일이 있습니다. 여기서 단어는 한 문장에 속하고 다음 문장에 속한 단어도 서로 아래에 있습니다. 아래 표현 #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
  • -00Perl에게 단락 모드에서 파일을 읽도록 지시합니다(단락은 하나 이상의 빈 줄로 구분됩니다).

  • -aPerl에게 입력을 공백의 배열로 자동 분할하도록 지시합니다 @F(awk가 입력을 자동으로 $1, $2, $3 등으로 분할하는 방법과 유사).

    -a이 옵션은 또한 암시적으로 설정되어 -nPerl이 다음과 같이 동작하도록 합니다 sed -n(자동으로 인쇄하지 않고 모든 입력 읽기). -p이 옵션(-n 없이 sed와 같이 수정될 수 있는 입력을 자동으로 인쇄)은 명령줄에 옵션을 추가하여 무시할 수 있습니다 .

  • -E인쇄 후 자동으로 새 줄을 추가하는 기능 과 같은 스크립트의 모든 선택적 기능을 활성화하는 것이 조금 더 쉽습니다( say대신 사용하는 경우 print join(" ", @F), "\n"이 작업을 수행해야 합니다 ).-e-E

    sayPerl은 오랫동안 사용되어 왔으며 기본적으로 활성화되어야 하지만 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

정확히 당신이 원하는 것이 아닙니다.

관련 정보