파일의 행에서 열로 변환


15

파일이 있다고 가정합니다.

파일 1 :

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

File2 내가 원하는 :

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

File1의 행에서 열로 변환


파일이 둘 이상의 행으로 구성되어 있고 출력에 둘 이상의 열이 있어야하는 경우이 AWK 스크립트 를 사용해보십시오 .
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


20

를 사용하여 tr반복되는 각 공백 문자 ( )를 단일 줄 바꿈 ( \n) 문자로 바꿉니다.

tr -s ' '  '\n'< infile > outfile

그러나 나는 당신이 이런 것을 원한다고 생각합니까?

12 34 1 a #
abcd-> 2 b $
# $ @ % 3 c @
                4 일 %

로에게 awk우리가 할 수있는 :

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } 
    END{ for (i in RtoC) print RtoC[i] }' infile

이것은 각각의 동일한 파일 번호 위치를 서로 결합하고 END첫 번째 열의 첫 번째 행, 두 번째 열의 두 번째 행 등의 결과를 인쇄합니다. 물론 입력 파일은 메모리 크기로 제한됩니다.


동일한 데이터와 코드를 사용하여 마지막 열을 4 d %와 같은 첫 번째 레코드로 인쇄 한 다음 두 번째 레코드 1 a # 등으로 인쇄했습니다.
Abhinay

8

grep을 통해 간단히 할 수 있습니다. 기본적으로 grep은 일치하는 내용을 별도의 줄 바꿈으로 인쇄합니다.

grep -oP '\S+' infile > outfile

또는

grep -o '[^[:space:]]\+' infile > outfile

1
grep
Volker Siegel

8

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

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

7

GNU의 datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamash이 작업에 가장 적합한 도구 인 것처럼 보이지만 다른 도구를 사용할 수있는 방법은 매력적입니다!
마크 스튜어트

6

다음을 사용하여이 작업을 수행 할 수도 있습니다 sed.

$ sed -e 's/  */\n/g' file1 > file2

참고 : 단어에 공백이 포함 된 상황은 처리하지 않습니다.


내가 말할 수있는 한 GNU sed가 필요합니다. mac (BSD)과 함께 제공되는 \n것은 개행 문자로 보이지 않습니다
D. Ben Knoble

5

을 사용 awk하여 출력 필드 구분 기호 ( OFS)를 레코드 (행) 구분 기호 ( RS)로 설정하십시오.

awk '{OFS=RS;$1=$1}1' file > file2


0

당신은 또한 사용할 수 있습니다 sed

$ sed -i.bak s@' '@'\n'@g infile.txt

내가 사용하고 있습니다 @대체 작동을위한 구분자로. 백업 파일도 생성됩니다. 백업이 필요없는 경우 .bak를 제거하십시오

$ sed -i s@' '@'\n'@g infile.txt

0

파이썬 버전 :

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

이것은 <파이썬의 stdin으로의 리디렉션 input.txtoutput.txt사용하고 >리디렉션 을 사용하여 기록합니다 . one-liner 자체는 모든 줄에서 stdin문자열 목록으로 읽습니다 . 여기서 모든 공백은 줄 바꿈으로 바뀌고 .join()함수를 사용하여 전체 텍스트를 다시 작성 합니다.

연속 된 여러 공백을 .split()줄 바꿈으로 바꾸는 것을 피하기위한 대체 방법은 줄을 단어 목록으로 나누는 것입니다. 그렇게하면 각 단어를 하나의 줄 바꿈으로 만 분리 할 수 ​​있습니다.

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt

0

을 사용하여 xargs( souravc의 답변 에서 도난당한 ) :

xargs -n 1 < File1 > File2

또는 약간의 재 포맷이 필요한 경우 필요에 따라 printf형식 문자열을 사용하십시오 .

xargs printf '%s\n' < File1 > File2

0

내 해결책은 다음과 같습니다.

#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.