450.000 × 15.000 탭으로 구분된 필드 파일의 x 및 y축을 전치해야 했기 때문에 먼저 A.txt라는 작은 5 × 4 테스트 파일을 사용해 보았습니다.
x column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
나는 이것을 시도했습니다 :
for i in {1..4}; do cut -f"$i" A.txt | paste -s; done > At.txt
하지만 제대로 작동하지 않습니다.
출력은 다음과 같습니다
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3
2
5
8
11
답변1
입력이 탭으로 구분된 필드가 있는 Unix 텍스트 파일이고 paste
GNU를 사용한다고 가정하면 명령이 제대로 작동합니다. GNU가 아닌 시스템에서는 다음을 사용해야 합니다.
$ for i in {1..4}; do cut -f"$i" A.txt | paste -s - ; done
x row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
-
표준 입력에서 읽도록 지시하는 인수에 주목하세요 .paste
넌 꼭 이렇게 할 거야아니요파일을 450,000번 읽어야 하므로 450,000개 열에서 실행하려고 합니다. 다른 솔루션을 사용하는 것이 좋습니다.
예를 들어 "행과 열 바꾸기".
위 명령을 DOS 텍스트 파일에서 실행하면 터미널에 다음과 같은 출력이 생성됩니다.
x row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
11
출력을 새 파일로 리디렉션하고 vim
편집기에서 파일을 열면 다음이 표시됩니다.
x row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3^M 2^M 5^M 8^M 11^M
이들 각각은 ^M
캐리지 리턴 문자(DOS 텍스트 줄 끝에 있는 추가 문자)입니다. 이러한 캐리지 리턴은 커서를 줄의 시작 부분으로 다시 이동시키므로 터미널의 마지막 줄에 표시되는 유일한 항목은 탭 문자 및 11
(다른 열을 덮어쓰는) 것입니다.
를 실행하여 입력 파일이 Unix 텍스트 파일인지 확인하세요 dos2unix A.txt
.
답변2
Cygwin은 Gnu 환경입니다. 문제는 줄 끝이 MS-Windows의 복용량 줄 끝이 다르다는 것입니다. 먼저 dos2unix를 통해 파일을 전달합니다(텍스트 파일에 대해서만 이 작업을 수행합니다).
지금 다시 인쇄했습니다. od -ta
내 터미널이 dos cmd와 다르게 렌더링하기 때문에 이것을 파이핑하고 있습니다(cmd는 캐리지 리턴을 줄 바꿈으로 변경합니다) .
#unix2dos A.txt
#for i in {1..4}; do cut -f"$i" A.txt | paste -s; done | od -ta
0000000 x ht r o w 1 ht r o w 2 ht r o w 3
0000020 ht r o w 4 nl c o l u m n 1 ht 0 ht
0000040 3 ht 6 ht 9 nl c o l u m n 2 ht 1 ht
0000060 4 ht 7 ht 1 0 nl c o l u m n 3 cr ht
0000100 2 cr ht 5 cr ht 8 cr ht 1 1 cr nl
설명: cut
캐리지 리턴 문자를 마지막 필드의 일부로 처리하십시오. 개행 문자는 레코드 구분 기호입니다.