如何将空格分隔的文件转换为制表符分隔的文件?

如何将空格分隔的文件转换为制表符分隔的文件?

我的文件 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每行显示一个,因此实际数据很好。

相关内容