텍스트 파일을 탭으로 구분 된 스프레드 시트로 변환하려고합니다. 내 텍스트 파일은 다음과 같습니다.
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
그러나 tsv
LibreOffice 에서 결과 파일 을 열려고 할 때 열이 정확하지 않습니다. 이것이 위의 명령을 올바르게 실행하지 않거나 LibreOffice 가져 오기 기능에서 잘못된 작업을 수행하고 있는지 확실하지 않습니다.
참고로 원하는 결과는 다음과 같아야합니다.
답변
다음 과 같은 명령 줄 편집기를 사용할 수 있습니다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 :
백 슬래시 “\”로 끝나는 경우 다음 행을 추가하십시오.
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 흐름 처리된다.
이 명령은 각 행에 대해 첫 번째 (및 여기 만) 열의 내용을 표시합니다. 그런 다음 나머지를 NR
4로 나눈 나머지를 테스트하여 줄 바꿈 또는 탭을 추가하도록 선택합니다 .
답변
또 다른 최단 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