내 파일 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
한 줄에 하나씩 표시되므로 실제 데이터는 괜찮습니다.