잘라내기 및 붙여넣기 셸 명령을 사용하여 테이블의 x축과 y축을 바꾸는 방법

잘라내기 및 붙여넣기 셸 명령을 사용하여 테이블의 x축과 y축을 바꾸는 방법

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 텍스트 파일이고 pasteGNU를 사용한다고 가정하면 명령이 제대로 작동합니다. 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캐리지 리턴 문자를 마지막 필드의 일부로 처리하십시오. 개행 문자는 레코드 구분 기호입니다.

관련 정보