공백으로 구분된 파일을 탭으로 구분된 파일로 변환하는 방법은 무엇입니까? [폐쇄]

공백으로 구분된 파일을 탭으로 구분된 파일로 변환하는 방법은 무엇입니까? [폐쇄]

내 파일 pheno_Mt.txt는 다음과 같습니다:

IID pheno
1000017 -9
1000025 -9
1000038 1
1000042 -9
1000056 -9

그래서 공백으로 구분되어 있으므로 탭으로 구분하여 변환하고 싶습니다.

나는 시도했다:

cat pheno_Mt.txt | tr ' ' '\t' > pheno_Mtt.txt

이:

sed 's/ /\t/g' pheno_Mt.txt > pheno_Mtt.txt

그러나 이것은 첫 번째 줄만 탭으로 구분하고 나머지는 공백으로 구분합니다.

내가 이것을 실행하고 있는 컴퓨터는 다음과 같습니다.

NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"

od -c pheno_Mt.txt > outt
head outt
0000000   I   I   D       p   h   e   n   o  \n   1   0   0   0   0   1
0000020   7       -   9  \n   1   0   0   0   0   2   5       -   9  \n
0000040   1   0   0   0   0   3   8       1  \n   1   0   0   0   0   4
0000060   2       -   9  \n   1   0   0   0   0   5   6       -   9  \n
0000100   1   0   0   0   0   7   4       -   9  \n   1   0   0   0   0
0000120   8   9       -   9  \n   1   0   0   0   0   9   3       1  \n
0000140   1   0   0   0   1   0   8       -   9  \n   1   0   0   0   1
0000160   1   5       -   9  \n   1   0   0   0   1   2   7       2  \n
0000200   1   0   0   0   1   3   0       -   9  \n   1   0   0   0   1
0000220   4   9       -   9  \n   1   0   0   0   1   5   1       -   9

od -c pheno_Mtt.txt > outtt
head outtt
0000000   I   I   D  \t   p   h   e   n   o  \n   1   0   0   0   0   1
0000020   7  \t   -   9  \n   1   0   0   0   0   2   5  \t   -   9  \n
0000040   1   0   0   0   0   3   8  \t   1  \n   1   0   0   0   0   4
0000060   2  \t   -   9  \n   1   0   0   0   0   5   6  \t   -   9  \n
0000100   1   0   0   0   0   7   4  \t   -   9  \n   1   0   0   0   0
0000120   8   9  \t   -   9  \n   1   0   0   0   0   9   3  \t   1  \n
0000140   1   0   0   0   1   0   8  \t   -   9  \n   1   0   0   0   1
0000160   1   5  \t   -   9  \n   1   0   0   0   1   2   7  \t   2  \n
0000200   1   0   0   0   1   3   0  \t   -   9  \n   1   0   0   0   1
0000220   4   9  \t   -   9  \n   1   0   0   0   1   5   1  \t   -   9

답변1

$ tr ' ' '\t' <pheno_Mt.txt
IID     pheno
1000017 -9
1000025 -9
1000038 1
1000042 -9
1000056 -9

이것것 같다이는 tr명령이 파일의 첫 번째 줄에만 작업을 수행한 것과 같지만 탭의 출력으로 인해 커서가 화면의 다음 8의 배수로 이동하고 그 위치가 7자 숫자 다음에 한 공백이 되기 때문에 효과는 다른 행에 대한 탭입니다나타나다그냥 공간.

그런데, 이를 수행하는 또 다른 방법은 원본 파일에 사용된 공백 수에 의존하지 않는 것입니다.

$ awk -v OFS='\t' '{ print $1, $2 }' pheno_Mt.txt
IID     pheno
1000017 -9
1000025 -9
1000038 1
1000042 -9
1000056 -9

awk이는 공백으로 구분된 입력에서 읽은 두 개의 탭으로 구분된 열을 출력하는 데 사용됩니다 .

또는 원하는 수의 열에 대해

$ awk -v OFS='\t' '{ $1=$1; print }' pheno_Mt.txt
IID     pheno
1000017 -9
1000025 -9
1000038 1
1000042 -9
1000056 -9

이렇게 하면 awk첫 번째 필드를 수정하여 전체 레코드가 다시 공식화됩니다. 일반 형식은 print탭 문자를 구분 기호로 사용하여 레코드를 인쇄합니다.

답변2

일반적인 8자리 탭 문자를 사용하면

$ printf '1234567 abc\n'
1234567 abc

이것과 차이는 없습니다:

$ printf '1234567\tabc\n'
1234567 abc

모든 전화번호의 길이는 정확히 7자리입니다.

od 출력에는 \t한 줄에 하나씩 표시되므로 실제 데이터는 괜찮습니다.

관련 정보