我的文件 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 字符之后的一个空格number,效果是其他行的tab出现仅是一个空间。
顺便说一句,执行此操作的另一种方法是,该方法不依赖于原始文件中使用的空格数
$ 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
每行显示一个,因此实际数据很好。