텍스트 파일의 네 번째 줄마다 Gedit 또는 명령 줄을 사용하여 수정할 수 있습니까? 보이게하는 것입니다. Dog

텍스트 파일을 탭으로 구분 된 스프레드 시트로 변환하려고합니다. 내 텍스트 파일은 다음과 같습니다.

Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana

Gedit 또는 LibreOffice의 표준 검색 및 바꾸기 기능을 사용하면 줄 끝을 탭으로 쉽게 바꿀 수 있습니다. 그러나 탭에 대해 캐리지 리턴을 바꾸면 다음과 같이됩니다.

Dog   Cat   Fish   Lizard   Wolf   Lion   Shark   Gecko   Coyote   Puma   Eel   Iguana

그러나 내가해야 할 일은 다음과 같이 보이게하는 것입니다.

Dog   Cat   Fish   Lizard
Wolf   Lion   Shark   Gecko
Coyote   Puma   Eel   Iguana

따라서 모든 줄 끝 문자 를 모든 네 번째 줄을 제외하고 탭으로 바꿀 수 있습니까?

그런 종류의 조건부 반복이 Gedit 또는 LibreOffice와 같은 프로그램 내에서 정규 표현식으로 수행 될 수 있는지 모르겠습니다. 어쩌면 이것이 일종의 명령 줄 기능이어야합니까? 시작하기에 가장 좋은 도구가 무엇인지 잘 모르겠습니다.


최신 정보:

다음 명령을 시도했습니다.

sed 'N;N;N;s/\n/\t/g' file > file.tsv

paste - - - - < file > file.tsv

pr -aT -s$'\t' -4 file > file.tsv

xargs -d '\n' -n4 < inputfile.txt

그러나 tsvLibreOffice 에서 결과 파일 을 열려고 할 때 열이 정확하지 않습니다. 이것이 위의 명령을 올바르게 실행하지 않거나 LibreOffice 가져 오기 기능에서 잘못된 작업을 수행하고 있는지 확실하지 않습니다.

캘크에서 TSV 열기

참고로 원하는 결과는 다음과 같아야합니다.

적절한 열



답변

다음 과 같은 명령 줄 편집기를 사용할 있습니다sed

sed 'N;N;N;s/\n/\t/g' file > file.tsv

또는 좀 더 프로그램 적 으로 GNU sed의 n skip m주소 연산자를 사용하여 결합하려는 각 에 백 슬래시 줄 연속 문자 를 추가하고 연속 줄 을 결합하기 위해 클래식 한 줄로 따라갑니다.

sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'

예를 들어 Sed One-Liners Explained :

  1. 백 슬래시 “\”로 끝나는 경우 다음 행을 추가하십시오.

    sed -e :a -e '/\\$/N; s/\\\n//; ta'
    

그러나 IMHO는 다른 표준 텍스트 처리 유틸리티 중 하나를 사용하면 더 쉽습니다.

paste - - - - < file > file.tsv

(의 개수 -는 열의 개수에 해당) 또는

pr -aT -s$'\t' -4 file > file.tsv

( -s$'\t출력이 여러 개의 탭으로 분리되는 것을 신경 쓰지 않으면를 생략 할 수 있습니다 ).


원본 파일에 Windows 스타일 CRLF 줄 끝이 있기 때문에 관찰하고있는 이상한 다시 가져 오기 동작은 거의 확실합니다. Windows에서 파일로 작업해야하는 경우 다양한 방법으로 명령으로 변환을 롤백 할 수 있습니다.

tr -d '\r' < file.csv | paste - - - -

또는

sed 'N;N;N;s/\r\n/\t/g' file.csv

전자는 모든 캐리지 리턴을 제거하지만 후자는 각 새 줄의 끝에 CR을 보존합니다 (원하는 최종 사용자가 Windows에있는 경우 원하는 것일 수 있음).


답변

xargs항상 하나의 공백으로 구분하여 네 줄을 하나로 하나로 묶을 수 있습니다 .

xargs -d '\n' -n4 < inputfile.txt

-d '\n'입력 분리 문자를 개행 문자로 설정합니다. 그렇지 않으면 공백도 해제됩니다. 어쨌든 입력 라인 당 하나의 단어 만 있다면, 이것을 생략 할 수도 있습니다.
-n4인수 번호 (출력 라인 당 입력 항목 수)를 4로 설정합니다.

산출:

Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana

또는 공백 대신 탭을 구분자로 사용하려는 경우 나중에 탭을 바꿀 수 있습니다. 그러나 입력 줄에 공백이 있으면 그 줄도 바뀝니다.

xargs -d '\n' -n4 | tr ' ' '\t'

출력 (브라우저 / 터미널의 탭 너비에 따라 표시) :

Dog Cat Fish    Lizard
Wolf    Lion    Shark   Gecko
Coyote  Puma    Eel Iguana


답변

다음을 사용할 수도 있습니다.

awk -v ORS="" '{print $1; print NR%4==0?"\n":"\t"}' file > file.tsv 

두 가지 awk 내장 변수는 다음과 같습니다.

  • ORS: O utput R ecord S eparator (기본값 = 개행). 각 인쇄 명령 끝에 추가됩니다.
  • NR: N의 현재의 암갈색 R AWK 흐름 처리된다.

이 명령은 각 행에 대해 첫 번째 (및 여기 만) 열의 내용을 표시합니다. 그런 다음 나머지를 NR4로 나눈 나머지를 테스트하여 줄 바꿈 또는 탭을 추가하도록 선택합니다 .


답변

또 다른 최단 awk접근 방식 :

awk '{printf $0 (NR%4?"\t":"\n")}' infile

printf와는 유일한 열은 다음과 옆에 … 그리고 탭 다음 \t각 후 문자 만 것이다 는 printf\n 때 ewline 문자 N의 의 암갈색 R의 ecord이의 요인이되었다 4 ( NR%4반환 0 어떤 삼항 연산자 (거짓)을 condition(s)?when-true:when-false하고있다.)


답변

이에 내 솔루션의 조합을 사용하는 것 sed등을 sed. 먼저이 >솔루션을 사용하여 네 번째 줄마다 특수 문자를 표시 할 수 있습니다.

이 경우 5 행부터 시작하여 4 행마다 표시하려고합니다. GNU sed에서 주소로 주어질 수 있습니다 5~4. 이 명령을 사용할 수 있습니다 :

sed '5~4s/^/>/' file1 > file2

그런 다음 sed루프를 사용 하여 줄 바꿈을 제거해야합니다 .

sed ':a;N;s/\n/ /;ba' file2 > file3

개행을 다른 문자로 변환하는 더 쉬운 방법이 있습니다 (예 tr:

tr '\n' ' ' < file2 > file3

어느 쪽이든, 두 가지를 결합하면

Dog   Cat   Fish   Lizard   >Wolf   Lion   Shark   Gecko   >Coyote   Puma   Eel   Iguana

( sed버전은 후행 줄 바꿈을 남기고 tr버전은 그렇지 않습니다)

그 후에 삽입 한 특수 문자 만 개행 문자로 변환하면됩니다. 예를 들어 , 줄 바꿈을 사용하도록 탭으로 구분 된 파일 변환을 참조하십시오 . 이 경우 >개행으로 변경하십시오 .

sed 'y/>/\n/' file3 > outfile

y명령은와 같은 기능을 수행하여 tr한 문자를 다른 문자로 변환하지만 s여기 에서 명령을 동일하게 사용할 수 있습니다 . 을 사용 하면 라인 ( ) 에서 각 경기 s를 수행해야 g합니다 sed 's/>/\n/g'.

중간 파일을 두 개 만드는 대신 파이프를 사용할 수 있습니다.

$ sed '5~4s/^/>/' file | sed ':a;N;s/\n/ /;ba' | sed 'y/>/\n/'
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana

후행 공백이 문제인 경우 다른 명령을 추가하여 제거 할 수 있습니다.

| sed 's/ $//'


답변

“완전성”을 위해서 여기에 순수 bash는 솔루션 :

#!/usr/bin/env bash

sep=$'\t'

while read one \
      && read two \
      && read three \
      && read four
do
  printf "%s\n" "$one$sep$two$sep$three$sep$four"
done

IFS적절하게 설정 되었다고 가정하면 공백과 함께 작동합니다 (기본적으로 AFAIK). 또한, 나는 이것이 휴대용 쉘 스크립트 일 수도 있고 POSIX 호환 쉘과 함께 작동 할 수 있다고 생각 합니다.


답변

q로 기록 된 vim 매크로는 작업을 적용한 다음 세 줄을 건너 뛸 수 있습니다. 그런 다음 해당 매크로를 n 번 실행합니다.

예 :

qq $ J i <TAB> <ESC> $ J i <TAB> <ESC> $ J i <TAB> <ESC> ^^ j qq 100 @q