행에서 열로 변환하는 방법?


11

다음과 같은 번호의 .txt 파일이 있습니다 (같은 행에 있음).

106849_01373    106849_01967    106850_00082    23025.7_01059   

나는 그런 식으로 변환하고 싶습니다 :

106849_01373
106849_01967
106850_00082
23025.7_01059

어떤 명령을 사용해야할지 모르겠습니다. 누군가 나를 도와 줄 수 있습니까?

답변:


5

여기에 하나 xargs

xargs -n1 < file.txt

데모:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs는 훌륭한 도구이며, 언급하지 않은 경우에는 그럴 것입니다.하지만 명령을 생략하면 echo를 대체한다는 단점이 있습니다 (일부 쉘과 달리 xargs에는 내장 에코가 없음) -n1은 xargs가 모든 arg에 대해 명령을 호출하도록 지시하므로이 예에서는 최소 6 개의 프로세스 (io 리디렉션, xargs 및 4 개의 echo를 수행하는 쉘)가 필요합니다. 이것은이 범위에서 나쁘지는 않지만 수천 라인 출력에서 ​​측정 속도가 느립니다.
초에 hildred

16

아주 쉬운 tr:

tr -s '[:blank:]' '\n' <file.txt

예:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

heemayl의 대답은 갈 길이지만 Perl을 사용하는 대안은 다음과 같습니다.

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: 자동 라인 엔딩 처리를 활성화합니다. 두 가지 별도의 효과가 있습니다. 먼저, -n 또는 -p와 함께 사용하면 $ / (입력 레코드 구분 기호)가 자동으로 숨겨집니다. 둘째, $ \ (출력 레코드 구분 기호)가 octnum 값을 갖도록 지정하여 모든 print 문에 해당 구분 기호가 다시 추가되도록합니다. octnum을 생략하면 $ \를 현재 값 $ /로 설정합니다.
  • -a: -n 또는 -p와 함께 사용하면 자동 분리 모드를 켭니다. @F 배열에 대한 암시 적 분할 명령은 -n 또는 -p에 의해 생성 된 암시 적 while 루프 내에서 첫 번째로 수행됩니다.
  • -n: Perl이 프로그램 주위에서 다음과 같은 루프를 가정하게하여 sed -n 또는 awk와 같은 파일 이름 인수를 반복합니다.

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: 한 줄의 프로그램을 입력하는 데 사용될 수 있습니다.

  • $,="\n": 출력 필드 구분자를 줄 바꾸기로 설정합니다.
  • print(@F): 출력 필드 구분 기호로 구분 된 필드를 인쇄합니다.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWK접근하다. 기본적으로 필드의 출력 구분 기호를 변경하고 반복합니다. 테스트 파일은 마지막에 ENDLINE으로 반복 붙여 넣은 예제입니다.

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

사용 sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

.. (초기) 줄마다 후행 줄 바꿈을 추가합니다.
heemayl

여러 줄로 확인하면 다음과 같이 분명한 사건이 발생합니다.
heemayl

당신의 대답과 함께 예제를 추가해 주
시겠습니까?

@heemayl 당신은 후행 공백을 개행 문자로 바꾸는 것을 의미했습니다. 구문이 이해하기 쉽지 않습니다. : /
techraf

1

나는 재미를 위해 파이썬 솔루션을 추가합니다.

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

이 명령은 마지막에 인수로 변환하려는 파일 이름으로 '한 따옴표'로 한 줄짜리 Python 3 스크립트를 실행합니다. 구문은 다음과 같습니다.

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

우리가 사용하는 1 줄 스크립트는 다음과 같습니다 (명확성을 위해 여러 줄로 확장).

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

sys명령 행 인수를 읽기 위해 모듈을 가져오고 첫 번째로 주어진 인수를 파일 이름으로 사용하여 파일에서 공백 문자로 구분 된 각 데이터 청크를 한 줄로 인쇄합니다.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.